1.此樹為二叉搜尋樹時
利用二叉搜尋樹的特點:
根節點的只大於左子樹每個結點的值,大於右子樹每個結點的值。
class
solution
if(p.valreturn root;
}}
2.此樹為普通二叉樹時
(1)轉化為兩條鍊錶求交點的方式
這種方法適用於雙親結點表示法或孩子結點表示法
(2)記錄兩個結點在樹中的路徑(所經過大結點用棧儲存起來)
讓兩個棧中size大的棧先出棧
當兩個棧size相同時,兩棧比較棧頂元素是否相同。找第乙個相同的元素。
class
solution
s.push
(root);if
(root==node)if(
path
(root.left,node,s)
||path
(root.right,node,s)
) s.
pop();
return
false;}
public treenode lowestcommonancestor
(treenode root, treenode p, treenode q)
stack
ppath=
newstack
<
>()
; stack
qpath=
newstack
<
>()
;path
(root,p,ppath)
;path
(root,q,qpath)
;int size1=ppath.
size()
;int size2=qpath.
size()
;while
(size1!=
0&&size2!=0)
else
if(size1else
else}}
return null;
}}
(3)普通二叉樹
可以參照二叉搜尋樹的解法:
若有乙個為root,則最近祖先為root
兩個結點分別在左右兩側時,則返回root
都在左子樹時,遞迴去左子樹判斷兩樹在左子樹的位置
都在右子樹時,遞迴去右子樹判斷兩樹在右子樹的位置
**1:
class
solution
if(root==node)
return
(isintree
(root.left,node)
||isintree
(root.right,node));
}public treenode lowestcommonancestor
(treenode root, treenode p, treenode q)
if(q==root||p==root)
boolean ispleft=
false
;boolean ispright=
false
;boolean isqleft=
false
;boolean isqright=
false;if
(isintree
(root.left,p)
)elseif(
isintree
(root.left,q)
)else
if(ispleft&&isqright || ispright&&isqleft)
if(ispleft&&isqleft)
else
}}
**2:較為簡潔,但也比上面的解法難懂
class
solution
treenode left=
lowestcommonancestor
(root.left,p,q)
; treenode right=
lowestcommonancestor
(root.right,p,q);if
(left==null)
if(right==null)
return root;
}}
二叉樹找到兩個結點的最近公共祖先
面試題68 i.二叉搜尋樹的最近公共祖先 這是乙個二叉搜尋樹,根節點左邊的數都小於根節點,根節點右邊的數都大於根節點。如果兩個結點的值都小於根節點的值,兩個結點一定都在樹的左邊。都大於根節點的值,那麼兩個結點一定都在樹的右邊。如果乙個大於根節點,乙個小於根節點,那麼根節點一定是最近的公共祖先。總結一...
(演算法)二叉樹中兩個結點的最近公共父結點
二叉樹中兩個結點的最近公共父結點 二叉樹結點的定義如下 struct treenode 前面在劍指offer中出現了類似的題目,但要求的思路都不太一樣,請參考 這裡介紹一種複雜度較低的遞迴實現。如題我們要找的二叉樹中兩個結點的最近公共結點,如果我們從上往下遞迴,按照深度優先搜尋的方式。如果當前結點為...
求二叉樹中兩個節點的最近公共祖先結點
1 原理 二叉搜尋樹是排序過的 位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共...