国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode75】第三十八題 二叉樹的最近公共祖先

這篇具有很好參考價值的文章主要介紹了【LeetCode75】第三十八題 二叉樹的最近公共祖先。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

題目:

示例:

分析:

代碼:


題目:

【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode

示例:

【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode

分析:

?給我們一棵二叉樹,然后給我們pq兩個節(jié)點,讓我們找出二叉樹中它們倆的最近的公共祖先。

那么什么樣的節(jié)點是它們倆的最近的公共祖先呢,是有兩種情況,第一種情況的pq兩個節(jié)點都在同一條路徑上,像下圖這樣:

【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode

?那這時pq的最近公共祖先就是pq之中更靠進上層的那個節(jié)點,也就是pq之中有個節(jié)點是自己的祖先節(jié)點。

另一種情況就是,他們分布在它們公共祖先的左右兩側,也就是pq里其中一個在最近公共祖先的左子樹上,另一個在最近公共祖先的右子樹上,像下圖這樣:

【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode

?因為pq已經各自分布在這個節(jié)點的左右兩側了,如果這個節(jié)點再往下走,不管是走哪個方向,都不可能再同時是它們兩個節(jié)點的公共祖先了。

所以我們在遞歸遍歷二叉樹的時候,一旦發(fā)現(xiàn)了pq分布在某個節(jié)點的左右兩側,或是直接遍歷到了pq節(jié)點,那就將當前節(jié)點返回出去即可。

我們做常規(guī)的遍歷二叉樹,并且再遍歷里頭再套一層遞歸遍歷分別去當前節(jié)點的左子樹和右子樹尋找是否有pq節(jié)點。

在遞歸遍歷之前先檢測當前節(jié)點是否是pq之一,是的話直接返回當前節(jié)點。

如果pq分別分布在當前節(jié)點的左右子樹,那么也直接返回當前節(jié)點。

最后一種情況就是,pq分布在當前節(jié)點的同一側。

?【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode

這時候雖然當前節(jié)點也還是兩個節(jié)點的公共祖先,但并不是最近的公共祖先,并且因為pq都在當前節(jié)點的某棵子樹上(左子樹或是右子樹),那么它們的最近公共祖先必然是在當前節(jié)點的子樹,所以在我們需要將當前節(jié)點向那棵子樹上轉移,直到出現(xiàn)上面第一第二種情況。【LeetCode75】第三十八題 二叉樹的最近公共祖先,LeetCode75題解,算法,c++,數(shù)據(jù)結構,leetcode文章來源地址http://www.zghlxwxcb.cn/news/detail-677237.html

代碼:

class Solution {
public:
    bool find(TreeNode* root,TreeNode*p,TreeNode* q){   //尋找是否有pq
        if(root==nullptr) return false;
        if(root==p || root==q) return true;
        return find(root->left,p,q)||find(root->right,p,q);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==p||root==q) return root;
        TreeNode* res=root;
        bool l=find(root->left,p,q);bool r=find(root->right,p,q);
        while(l||r){    
            //如果自己本身就是其中一個節(jié)點,那么直接返回即可
            if(res==p||res==q) return res;
            if(l&&!r){  //如果pq全部集中在左子樹,就往左子樹移動  
                res=res->left;    
            }else if(r&&!l){    //如果pq全部集中在右子樹,就往右子樹移動
                res=res->right;
            }else{  //如果是左右各占一個,那么返回該節(jié)點
                return res;
            }
            //尋找pq的分布情況
            l=find(res->left,p,q);
            r=find(res->right,p,q);
        }
        return root;
    }
};

到了這里,關于【LeetCode75】第三十八題 二叉樹的最近公共祖先的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Leetcode60天帶刷】day14二叉樹——144.二叉樹的前序遍歷,145.二叉樹的后序遍歷,94.二叉樹的中序遍歷

    【Leetcode60天帶刷】day14二叉樹——144.二叉樹的前序遍歷,145.二叉樹的后序遍歷,94.二叉樹的中序遍歷

    144. 二叉樹的前序遍歷 給你二叉樹的根節(jié)點? root ?,返回它節(jié)點值的? 前序 ? 遍歷。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 樹中節(jié)點數(shù)目在范圍? [0, 100] ?內 -100 = Node.val = 100 145. 二叉樹的后序遍歷 給你一棵二叉樹的根節(jié)點? root ?,返回其節(jié)點值的? 后序遍歷

    2024年02月10日
    瀏覽(33)
  • 【LeetCode】102. 二叉樹的層序遍歷、107. 二叉樹的層序遍歷 II

    【LeetCode】102. 二叉樹的層序遍歷、107. 二叉樹的層序遍歷 II

    ?作者:小盧 專欄:《Leetcode》 喜歡的話:世間因為少年的挺身而出,而更加瑰麗。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《人民日報》 102. 二叉樹的層序遍歷 給你二叉樹的根節(jié)點? root ?,返回其節(jié)點值的? 層序遍歷 ?。 (即逐層地,從左到右訪問所有節(jié)點) ?示例:

    2024年02月13日
    瀏覽(23)
  • 二叉樹OJ題:LeetCode--104.二叉樹的最大深度

    二叉樹OJ題:LeetCode--104.二叉樹的最大深度

    朋友們、伙計們,我們又見面了,本期來給大家解讀一下LeetCode中第104道二叉樹OJ題,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成! 數(shù)據(jù)結構與算法專欄: 數(shù)據(jù)結構與算法 個? 人? 主? 頁 ?: stackY、 C 語 言 專 欄 : C語言:從入門到精通 ?Leet

    2024年02月11日
    瀏覽(20)
  • LeetCode算法二叉樹—222. 完全二叉樹的節(jié)點個數(shù)

    LeetCode算法二叉樹—222. 完全二叉樹的節(jié)點個數(shù)

    目錄 222. 完全二叉樹的節(jié)點個數(shù) - 力扣(LeetCode) 代碼: 運行結果:? 給你一棵 ?完全二叉樹 ?的根節(jié)點? root ?,求出該樹的節(jié)點個數(shù)。 完全二叉樹?的定義如下:在完全二叉樹中,除了最底層節(jié)點可能沒填滿外,其余每層節(jié)點數(shù)都達到最大值,并且最下面一層的節(jié)點都集

    2024年02月07日
    瀏覽(30)
  • 二叉樹OJ題:LeetCode--144.二叉樹的前序遍歷

    二叉樹OJ題:LeetCode--144.二叉樹的前序遍歷

    朋友們、伙計們,我們又見面了,本期來給大家解讀一下LeetCode中第144道二叉樹OJ題,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成! 數(shù)據(jù)結構與算法專欄: 數(shù)據(jù)結構與算法 個? 人? 主? 頁 ?: stackY、 C 語 言 專 欄 : C語言:從入門到精通 ?Leet

    2024年02月13日
    瀏覽(23)
  • 【Leetcode -101.對稱二叉樹 -144.二叉樹的前序遍歷】

    【Leetcode -101.對稱二叉樹 -144.二叉樹的前序遍歷】

    題目:給你一個二叉樹的根節(jié)點 root , 檢查它是否軸對稱。 示例 1: 輸入:root = [1, 2, 2, 3, 4, 4, 3] 輸出:true 示例 2: 輸入:root = [1, 2, 2, null, 3, null, 3] 輸出:false 提示: 樹中節(jié)點數(shù)目在范圍[1, 1000] 內 100 = Node.val = 100 思路 :化為子問題比較左子樹和右子樹是否對稱;結束條

    2024年02月09日
    瀏覽(19)
  • leetcode543--二叉樹的直徑

    1. 題意 求二叉樹上最遠兩個節(jié)點之間的距離。 2. 題解 2.1 暴力 最長路徑的三種情況 通過根節(jié)點 在左子樹 在右子樹 通過根節(jié)點的最長路徑長度一定是左右子樹深度之和。 但是這樣求左右子樹的深度會不斷重復,所以復雜度很高。 2.2 動態(tài)規(guī)劃 我們可以在求深度的時候,更新

    2024年04月26日
    瀏覽(18)
  • LeetCode:二叉樹的前、中、后序遍歷——如何創(chuàng)建一棵【二叉樹】

    LeetCode:二叉樹的前、中、后序遍歷——如何創(chuàng)建一棵【二叉樹】

    ??道阻且長,行則將至。?? ??算法,不如說它是一種思考方式?? 算法專欄: ????123 二叉樹是一種樹形數(shù)據(jù)結構,其每個節(jié)點 最多只有兩個子節(jié)點 。通常將節(jié)點分為三種類型:根節(jié)點、內部節(jié)點和葉子節(jié)點。其中,根節(jié)點是二叉樹的唯一訪問起點,內部節(jié)點具有一個父

    2023年04月09日
    瀏覽(20)
  • 代碼隨想錄 Day13 二叉樹 LeetCode T104 二叉樹的最大深度 T111 二叉樹的最小深度 T222完全二叉樹的節(jié)點個數(shù)

    代碼隨想錄 Day13 二叉樹 LeetCode T104 二叉樹的最大深度 T111 二叉樹的最小深度 T222完全二叉樹的節(jié)點個數(shù)

    以下題解的更詳細思路來自于:代碼隨想錄 (programmercarl.com) 二叉樹的高度與深度 這里先補充一下二叉樹深度和高度的概念 高度:二叉樹中任意一個節(jié)點到葉子結點的距離 深度:二叉樹中任意一個節(jié)點到根節(jié)點的距離 下面給出一個圖便于理解 獲取高度與深度的遍歷方式 高度:后

    2024年02月08日
    瀏覽(27)
  • leetcode 257. 二叉樹的所有路徑

    leetcode 257. 二叉樹的所有路徑

    ? ? ? ? ?這題需要用到遞歸+回溯,也是我第一次接觸回溯這個概念。? ? ? ? ? 大致思路是: ????????在 reversal 函數(shù)中,首先將當前節(jié)點的值加入到路徑 path 中。然后判斷當前節(jié)點是否為葉子節(jié)點,即沒有左右子節(jié)點。如果是葉子節(jié)點,將路徑轉化為字符串并保存到

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包