二叉樹最近公共祖先LCA 解題過程問題分析

2021-10-10 13:42:59 字數 1647 閱讀 4632

相當於在root為根的樹中找p,q,找到了就傳給它的父節點(如果找到葉子結點還沒找到,那就是不存在p/q,就把null往父節點上傳),一層一層向上傳,可以理解為:

其實是乙個後序遍歷,遞迴後續遍歷找到節點p或者節點q,

//比如上面的例子,root[10]=4

//傳給4的父節點,root[4]

結果有以下幾種:

(1)p,q傳到某個節點root的左右子節點,那麼root就是lca

(2)q傳到某一層父節點的時候,這個父節點是p,那麼p就是lca

(3)p傳到某一層父節點的時候,這個父節點是q,那麼q就是lca

(4)如果p||q只有乙個找到了,另乙個沒有找到,那麼找到的那個是lca

(5)如果都沒有找到,lca就是null

其中,(2)(3)(4)可以合併為一種情況

(2)可以和(4)中只找到p合併,(3)可以和(4)中只找到q合併,這兩種又可以合併為以p/q為lca的情況,所以有以下三種結果:

(1)p,q分別在root的左右子樹中,那麼lca=root

(2)p是 root,q在root子樹中/q不在root的子樹中,lca=p;q是root…,lca=q;

(3)p,q都不在root子樹中,lca=null

怎麼找p,q?顯然是用二叉樹遞迴遍歷

模板如下:

treenode lca

(treenode root,treenode p,treenode q)

還沒有定義遞迴邊界,返回值,下面討論遞迴邊界:

遞迴邊界

(1)有p/q的遞迴邊界:因為通過遞迴遍歷樹一直往下找,如果有p/q,那麼一定會遞迴到形參root的實參為p/q的情況;

(2)沒有pq的遞迴邊界:如果沒有p/q,就直接遞迴到葉子結點,然後左右子樹為null;

if

(root==null)

return null;

//沒有p/q

if(root==p||root==q)

return root;

//有p/q

怎麼向上傳----向上傳其實就是遞迴一層層return的過程。

通過深度優先,後序遍歷找到了p或者q,在找到深度深的那個以後,

遞迴自頂向下判斷,分別在root的左子樹,和右子樹中找p,q

如果找到了就返回給根節點(不再向下遞迴,因為如果找到了,就是滿足了遞迴的邊界條件

就是一旦找到p(或者q)那麼就不用往下遞迴了,不論q是不是在p的子樹裡面,現在要做的就是看p的父節點的另乙個子樹裡面有沒有q,然後根據三種情況判斷返回值

treenode lca

(treenode root,treenode p,treenode q)

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

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 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 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...

二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 思路 剛開始使用boolean來判斷要查詢的兩節點在左右孩子上,後面修改為使用treenode與null判斷兩節點位置 1 分別向左孩子和右孩子遞迴。2 若當...

二叉樹的最近公共祖先

輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 4 輸出 5 法1 分別找出根節點到兩個節點的路徑,則最後乙個公共節點就是最低公共祖先。法2 public treen...