乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      (二叉樹)二叉樹的最近公共祖先

       dinghj 2019-04-22

      題目描述

      給定一個(gè)二叉樹, 找到該樹中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先。

      百度百科中最近公共祖先的定義為:“對(duì)于有根樹 T 的兩個(gè)結(jié)點(diǎn) p、q,最近公共祖先表示為一個(gè)結(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)?!?/p>

      例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
      在這里插入圖片描述
      示例 1:

      輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
      輸出: 3
      解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 1 的最近公共祖先是節(jié)點(diǎn) 3。
      示例 2:

      輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
      輸出: 5
      解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 4 的最近公共祖先是節(jié)點(diǎn) 5。因?yàn)楦鶕?jù)定義最近公共祖先節(jié)點(diǎn)可以為節(jié)點(diǎn)本身。

      說明:
      所有節(jié)點(diǎn)的值都是唯一的。
      p、q 為不同節(jié)點(diǎn)且均存在于給定的二叉樹中。

      題目分析

      做了一些二叉樹的題,發(fā)現(xiàn)二叉樹的查找問題一般都是從左右子樹遞歸去解決,也往往都能得到答案,因此,這道題可以考慮是否能從左右子樹進(jìn)行遞歸去解決呢?
      首先,要想通過遞歸來實(shí)現(xiàn),就需要先確定臨界條件,那么臨界條件是什么呢?換句話說,臨界條件就是遞歸中能夠直接返回的特殊情況,第一點(diǎn)則是最常見的“判空”,判斷根結(jié)點(diǎn)是否是空節(jié)點(diǎn),如果是,那么肯定就可以馬上返回了,這是一個(gè)臨界條件;再來考慮題意,在以root為根結(jié)點(diǎn)的樹中找到p結(jié)點(diǎn)和q結(jié)點(diǎn)的最近公共祖先,那么特殊情況是什么呢?很顯然,特殊情況就是根結(jié)點(diǎn)就等于q結(jié)點(diǎn)或p結(jié)點(diǎn)的情況,想一下,如果根結(jié)點(diǎn)為二者之一,那么根結(jié)點(diǎn)就必定是最近公共祖先了,這時(shí)直接返回root即可。由此看來,這道題就一共有三種特殊情況,root == q 、root == p和root==null,這三種情況均直接返回root即可。
      根據(jù)臨界條件,實(shí)際上可以發(fā)現(xiàn)這道題已經(jīng)被簡化為查找以root為根結(jié)點(diǎn)的樹上是否有p結(jié)點(diǎn)或者q結(jié)點(diǎn),如果有就返回p結(jié)點(diǎn)或q結(jié)點(diǎn),否則返回null。
      這樣一來其實(shí)就很簡單了,從左右子樹分別進(jìn)行遞歸,即查找左右子樹上是否有p結(jié)點(diǎn)或者q結(jié)點(diǎn),就一共有4種情況:
      第一種情況:左子樹和右子樹均找沒有p結(jié)點(diǎn)或者q結(jié)點(diǎn);(這里特別需要注意,雖然題目上說了p結(jié)點(diǎn)和q結(jié)點(diǎn)必定都存在,但是遞歸的時(shí)候必須把所有情況都考慮進(jìn)去,因?yàn)轭}目給的條件是針對(duì)于整棵樹,而遞歸會(huì)到局部,不一定都滿足整體條件)
      第二種情況:左子樹上能找到,但是右子樹上找不到,此時(shí)就應(yīng)當(dāng)直接返回左子樹的查找結(jié)果;
      第三種情況:右子樹上能找到,但是左子樹上找不到,此時(shí)就應(yīng)當(dāng)直接返回右子樹的查找結(jié)果;
      第四種情況:左右子樹上均能找到,說明此時(shí)的p結(jié)點(diǎn)和q結(jié)點(diǎn)分居root結(jié)點(diǎn)兩側(cè),此時(shí)就應(yīng)當(dāng)直接返回root結(jié)點(diǎn)了。
      綜上也不難寫出結(jié)果了:

      TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
              if(root==p||root==q||!root)return root;
              
              TreeNode* left=lowestCommonAncestor(root->left,  p, q);
              TreeNode* right=lowestCommonAncestor(root->right,  p, q);
              
              if(!left&&!right)return NULL;
              else if(left&&!right)return left;
              else if(right&&!left)return right;
              
              return root;
          }
      

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請遵守用戶 評(píng)論公約

        類似文章 更多