二叉樹的最近公共祖先

2021-10-19 12:19:40 字數 916 閱讀 1353

(labuladong演算法小抄3.6總結)

這個問題需要知道就是p點和q點所在的位置。然後再根據這兩個點的位置,來尋找他們最近的交叉點,也就是最近的公共祖先的位置。其實本質上還是乙個樹的遍歷問題。但是不同的是它需要處理的情況比較多,**不難,難的地方在於怎麼找到這個交叉點。

首先來思考一下,既然想要找到p和q的最近公共祖先,那麼先要找到這兩個點。然後找到兩個點之後就需要通知上一層的樹,告訴他我找到了這個點了,並且把本節點返回去了作為公共祖先的可能候選點。

但實際上細分就是會有三種情況:

①其中乙個節點的左子樹和右子樹分別找到了p和q,那麼就返回這個根節點就好了,他就是最近公共祖先

②大家都沒找到,那麼就返回null

③如果只是找到p和q其中乙個,那麼就返回這棵樹的根節點,告訴上一層我找到乙個了,然後往上繼續尋找他們相交的地方。

這個問題也涉及到函式lowestcommonancestor的三問 :

①函式的定義:就是尋找最小公共祖先的節點,並返回

②函式的引數:(root ,p,q)p和q是為了對比,root是為了遍歷樹

③如果知道了函式的結果應該做什麼?

自然就是處理basecase的問題,如果root為null就返回null,如果root==p|q那麼就直接返回root就好了。

可能有人想要問這裡的處理不就和上面的情況處理一樣嗎?這裡處理的是basecase而不是三種情況,如果沒有basecase的處理,那麼這個函式就不會返回,也沒有判斷的終點。另外三種情況處理的是子樹問題,相對比較大,而basecase處理的就是點的問題了。

最後給出**

class

solution

if(left==null&&right==null)

return left==null?right:left;

}}

二叉樹的最近公共祖先

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

二叉樹的最近公共祖先

例如,給定如下二叉樹 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 的最近公共祖先是節點 3。示例 2 輸入 root 3,5,1,6,2,0,...