找出二叉樹中某兩個結點的第乙個公共祖先

2021-07-29 06:58:42 字數 1825 閱讀 9167

設計乙個演算法,找出二叉樹中某兩個結點的第乙個公共祖先.。不得將額外的結點儲存在另外的資料結構中。注意:這不一定是二叉查詢樹。

題目分析:

假設1:這個二叉樹是二叉排序樹(o(n))

如果題目中的二叉樹是二叉排序樹,那麼這道題目變的相對簡單很多,我們只需要從根節點開始遍歷,有以下三種情況發生:

(1)如果題目給的兩個節點的值都大於當前節點,那麼繼續遍歷當前節點的右子樹

(2)如果題目給的兩個節點的值都小於當前節點,那麼繼續遍歷當前節點的左子樹

(3)如果當前節點大於其中乙個節點而小於其中另外乙個節點,那麼則返回該節點,該節點便是兩個節點的公共祖先節點。

假設2:這個二叉樹是普通的二叉樹,但是存在指向父節點的指標

由於每個節點存在指向父節點的指標,所以如果給定任意乙個節點,便可以找到從該節點到根節點的路徑,因此我們可以找到題目中給予的兩個節點分別到根節點的路徑,因此該題目便變成了求兩個單向鍊錶的第乙個公共節點。

假設2延伸:求兩個單向鍊錶第乙個公共節點有兩種方法:

(1)第一種方法是:兩個鍊錶如果有 公共節點,那麼從第乙個公共節點開始往後的所有節點都相同,我們首先遍歷兩個鍊錶,求出兩個鍊錶的長度。然後設定兩個指標分別指向這兩個單向鍊錶的頭結 點,首先讓鍊錶較長的指標先移動,直至移動的剩餘長度與鍊錶較短的那個鍊錶長度相同為止,這個時候兩個指標開始同時移動,直到兩個指標指向的節點相同,這 個節點便是這兩個單向鍊錶的第乙個公共節點。

(2)第二種方法是:可以設定兩個棧,首先分別把兩個鍊錶中的節點依次入棧,接下來從兩個棧中同時乙個乙個的將節點彈出,遇到第一對彈出的節點不同時,那麼前一次彈出相同的節點便是這兩個鍊錶的第乙個公共節點。

假設3:這個二叉樹是普通的二叉樹,並且不存在指向父節點的指標

《方法1>:判斷子樹中是否存在某節點(時間複雜度o(n^2))

首先建立乙個方法判斷一棵樹中是否存在某個節點,這個比較簡單,只需要遍歷整棵樹,如果存在返回true,如果不存在則返回false。

接下來的判斷過程就相當於二叉排序數的判斷過程了,只不過二叉排序樹判斷乙個節點是否在左子樹或者右子樹中只需要和父節點比較,而普通的樹需要遍歷整個左子樹或者右子樹才能實現。

(1)如果題目給的兩個節點都在右子樹,那麼繼續遍歷當前節點的右子樹

(2)如果題目給的兩個節點都在左子樹,那麼繼續遍歷當前節點的左子樹

(3)如果給定的兩個節點乙個在左子樹,乙個在右子樹,則返回當前節點。

《方法2>:尋找從根節點到子節點的路徑

如果找到從根節點到兩個子節點的路徑,那麼題目就迎刃而解了,可以用棧遍歷二叉樹,最後找到從根節點到相應節點的路徑,類似二叉樹的先序非遞迴遍歷一樣,先遍歷根節點,接著遍歷左子樹,接著遍歷右子樹,直到遍歷到相應節點為止,這時棧中的元素便是路徑元素。

《方法3>:遞迴遍歷

設根節點為root,兩個節點分別為p,q,用前序遍歷方法遞迴遍歷整個二叉樹,如果只找到p則返回p,如果只找到q則返回q,如果乙個節點的左右子樹分別找到p,q,則返回該節點,其他情況返回null。

/*

*若p為root的子孫,則返回true

*/boolean covers(treenode root,treenode p)

treenode commonancestorhelper(treenode root,treenode p,treenode q)

treenode commonancestor(treenode root,treenode p,treenode q)

return commonancestorhelper(root,p,q);

}

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

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

二叉樹兩個結點的最低共同父結點

需要思考為什麼採用inorder遍歷是可以的?其他遍歷方式結果不正確?include templateclass treenode t value treenode left treenode right templateclass visitcontext treenode node1 treen...

二叉樹兩個結點的最低共同父結點

輸入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。網上看來的題目,以下都有參考。求數中兩個結點的最低共同結點是面試中經常出現的乙個問題。這個問題至少有兩個變種。第一變種是二叉樹是一種特殊的二叉樹 查詢二叉樹。也就是樹是排序過的,位於左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點...