求解二叉樹中兩個結點的最低公共父結點

2021-08-22 06:16:46 字數 2611 閱讀 9371

一,問題描述

構建一棵二叉樹(不一定是二叉查詢樹),求出該二叉樹中某兩個結點的最低公共父結點。借用一張圖如下:

結點8 和 結點5 的最低公共父結點為 結點2

二,二叉樹的構建

與 求二叉樹中第k層結點的個數 文章中的第二點:二叉樹構建相同

三,求解最低公共父結點的演算法實現

有兩種思路,一種是通過中序遍歷和後序遍歷。由於中序遍歷是先左子樹中的結點,再訪問根,再訪問右子樹中結點,因此這兩個結點的公共父結點一定處於這兩個結點之間。

如:中序遍歷:8, 4, 9,2, 5, 1, 6, 3, 7     結點2處於結點8 和 結點5 之間,也就是說:結點8 和 結點5 的最低公共父結點在 [8~5]之間的候選結點,這裡為中取

後序遍歷是先訪問左右子樹中的結點,最後再訪問根。故這兩個結點的最低公共父結點一定處於 結點8 和 結點5 之後的結點,且是第乙個出現在中的那個結點。

後序遍歷:8, 9, 4, 5,2, 6, 7, 3, 1        8->9->4->5 這之後的結點,才可能是 結點8 和 結點5 的父結點。

另一種方法則是:遞迴,首先從樹根開始考慮:

①結點a 和 結點b 要麼都在樹根的左子樹中;②要麼都在樹根的右子樹中;③要麼乙個在左子樹中,乙個在右子樹中。

這是乙個分治演算法,對於情況①和②,可以繼續遞迴分解。對於情況③屬於**第10行判斷,複雜度為o(1)

遞迴表示式可表示為:t(n)=2t(n/2)+o(1),解得t(n)=o(n)

對於③,最低公共父結點為樹根。

對於①,可以進一步判斷,從樹根的左孩子結點考慮:

1)結點a 和 結點b 要麼都在樹根的左子孩子 的 左子樹中;2)要麼都在樹根的左孩子 的 右子樹中;3) 要麼乙個在樹根的左孩子的 左子樹中,乙個在樹根的左孩子 的 右子樹中。

對於②,可以進一步判斷,從樹根的右孩子的結點考慮:

1)結點a 和 結點b 要麼都在樹根的右子孩子 的 左子樹中;2)要麼都在樹根的右孩子 的 右子樹中;3) 要麼乙個在樹根的右孩子的 左子樹中,乙個在樹根的右孩子 的 右子樹中。

下面**實現遞迴求解最低公共父結點。

四,**實現(node1 node2 都是二叉樹中的結點)

1     /**

2 * 求解node1 和 node2 的最低公共父結點

3 * @param node1

4 * @param node2

5 * @return 最低公共父結點

6 */

7 public binarynodecommonnode(binarynodenode1, binarynodenode2, binarynoderoot)

根據程式中的第8行和第10行的if語句,可知:

1)若 left==null, 則說明 node1,node2 都不在 root.left子樹中

2)若right==null,則說明 node1,node2 都不在root.right子樹中

3)當對於某個結點,當執行了第16,17行的遞迴後 ,left 和 right 都不為空,說明node1 在 該結點.left子樹中,node2 在 該結點.right子樹中

故第19-20行,返回 該結點 作為公共父結點

例如,求結點8 和 結點5 的最低公共父結點:遞迴呼叫過程如下:

a)commnode(8,5,1)==2

b1)      commnode(8,5,2)==2

c1)             commnode(8,5,4)==8

d1)                      commnode(8,5,8)==8

d2)                      commnode(8,5,9)==null

c2)             commnode(8,5,5)==5

b2)      commnode(8,5,3)==null

a)生成了 b1)  b2) 兩個遞迴呼叫,其中 b2)為空,因為結點8,結點5 不在以3為根的子樹中

b1)生成了 c1)   c2)兩個遞迴呼叫,其中 c2) 是commnode(8,5,5),根據程式第10行if,返回5,而c1)又生成了 d1)  d2)兩個遞迴呼叫

其中,d1) 返回8,d2)返回null, 故執行到第21行語句,return 不空的那個left/right,也就是 d1) 返回的結點8

由於 c1)返回了5, c2)返回了8,都不為空,執行到第19-20行,返回它們的root,即,結點4和結點5的公共父結點:結點2

由於 b1) 生成了 c1)  c2)   故 b1) 的值是結點2    又因為 b2) 為null

故 a) 最終是 b1) 的值,即為結點2

可把該方法放到求二叉樹中第k層結點的個數 中 的完整**給出的程式中進行測試。

原文:

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

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

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

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

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

入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。分析 求數中兩個結點的最低共同結點是面試中經常出現的乙個問題。這個問題至 少有兩個變種。第一變種是二叉樹是一種特殊的二叉樹 查詢二叉樹。也就是樹是排序過的,位於 左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點大。我們只需要從根結點...