找到二叉樹中兩個指定結點的最近公共祖先

2021-10-04 02:32:01 字數 2219 閱讀 6890

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 原理 二叉搜尋樹是排序過的 位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共...