一,問題描述
構建一棵二叉樹(不一定是二叉查詢樹),求出該二叉樹中某兩個結點的最低公共父結點。借用一張圖如下:
結點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...
二叉樹兩個結點的最低共同父結點
輸入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。網上看來的題目,以下都有參考。求數中兩個結點的最低共同結點是面試中經常出現的乙個問題。這個問題至少有兩個變種。第一變種是二叉樹是一種特殊的二叉樹 查詢二叉樹。也就是樹是排序過的,位於左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點...
二叉樹兩個結點的最低共同父結點
入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。分析 求數中兩個結點的最低共同結點是面試中經常出現的乙個問題。這個問題至 少有兩個變種。第一變種是二叉樹是一種特殊的二叉樹 查詢二叉樹。也就是樹是排序過的,位於 左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點大。我們只需要從根結點...