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

2021-10-03 12:58:06 字數 1469 閱讀 9897

面試題68 - i. 二叉搜尋樹的最近公共祖先

這是乙個二叉搜尋樹,根節點左邊的數都小於根節點,根節點右邊的數都大於根節點。

如果兩個結點的值都小於根節點的值,兩個結點一定都在樹的左邊。都大於根節點的值,那麼兩個結點一定都在樹的右邊。如果乙個大於根節點,乙個小於根節點,那麼根節點一定是最近的公共祖先。

總結一句話,找到兩者分道揚鑣的最先的那個結點

public treenode lowestcommonancestor

(treenode root, treenode p, treenode q)

treenode tmp = root;

while

(true

)else

if(p.val > tmp.val && q.val > tmp.val)

else

}}

面試題68 - ii. 二叉樹的最近公共祖先

這是乙個普通的二叉樹,不是二叉搜尋樹了。

用迭代的方法來解題。

lowestcommonancestor方法輸入根節點,和另外兩個結點,返回兩個結點最近的祖先結點。

如果p或者q有等於根節點的,返回根節點。如果根節點為null,返回null

如果p和q都在根節點的左子樹中的話,lowestcommonancestor(root.right, p, q)這個方法應該返回null

如果p和q都在根節點的右子樹中的話,lowestcommonancestor(root.left, p, q)這個方法應該返回null

如果p和q分別在兩個子樹中的話,乙個方法返回p結點,乙個方法返回q結點。那麼真正應該返回的應該是root。

null起到了乙個標記作用

public treenode lowestcommonancestor

(treenode root, treenode p, treenode q)

treenode leftfind =

lowestcommonancestor

(root.left, p, q)

; treenode rightfind =

lowestcommonancestor

(root.right, p, q);if

(leftfind == null)

return rightfind;

if(rightfind == null)

return leftfind;

return root;

}

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

1.此樹為二叉搜尋樹時 利用二叉搜尋樹的特點 根節點的只大於左子樹每個結點的值,大於右子樹每個結點的值。class solution if p.valreturn root 2.此樹為普通二叉樹時 1 轉化為兩條鍊錶求交點的方式 這種方法適用於雙親結點表示法或孩子結點表示法 2 記錄兩個結點在樹中的...

(演算法)二叉樹中兩個結點的最近公共父結點

二叉樹中兩個結點的最近公共父結點 二叉樹結點的定義如下 struct treenode 前面在劍指offer中出現了類似的題目,但要求的思路都不太一樣,請參考 這裡介紹一種複雜度較低的遞迴實現。如題我們要找的二叉樹中兩個結點的最近公共結點,如果我們從上往下遞迴,按照深度優先搜尋的方式。如果當前結點為...

完全二叉樹兩個結點的公共結點

1 2 3 4 5 6 7 如上圖所示,由正整數 1,2,3,組成了一棵無限大的二叉樹。從某乙個結點到根結點 編號是1的結點 都有一條唯一的路徑,比如從5到根結點的路徑是 5,2,1 從4到根結點的路徑是 4,2,1 從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是 1 對於兩個結點x和y,...