int maxdist(tree root)
if(root->right != null) root->rm = maxdist(root->right) + 1;
//如果以該節點為根的子樹中有最大的距離,那就更新最大距離
int sum = root->rm + root->lm;
if(sum > max)
return root->rm > root->lm ? root->rm : root->lm;
}
演算法理解:
首先要分清乙個概念什麼是樹的高度,什麼是樹的深度。
簡單來說,對於整棵樹來說,最深的葉結點的深度就是樹的深度;樹根的高度就是樹的高度。這樣樹的高度和深度是相等的。
對於樹中相同深度的每個結點來說,它們的高度不一定相同,這取決於每個結點下面的葉結點的深度。
了解了高度與深度的概念。要計算乙個樹任意兩個節點的最大距離,從根節點出發,無非就兩種情況。1.一種是最長路徑經過根節點,2.另一種是最長路徑不經過根節點。
1.對於情況1,左子樹的高度加上右子樹的高度即為整棵樹的最大路徑。
2.對於情況2,既然不經過根節點,那就可以再次分為兩種情況,2.1整棵樹的最大路徑是左子樹的最大路徑,2.2整棵樹的最大路徑是右子樹的最大路徑。
而下面的兩種情況又可以歸結為最初始的求樹的最大路徑演算法,各分為過根節點和不過根節點的兩種情況。如此通過遞迴演算法,最終可以求得整棵樹的最大路徑。
理解參考:
演算法理解參考:
樹的理解參考:
題目來自:牛客網
二叉樹兩個節點之間的最大距離
二叉樹兩個節點之間的最大距離,以根節點分析,最大距離可能有3種情況 左左 右右 左右 左左相當於求左子樹上的遞迴子問題,右右相當於求右子樹的遞迴子問題。左右是需要我們處理的問題。我們使用record陣列來記錄左邊的最大值和右邊的最大值。includeusing namespace std struc...
二叉樹兩個節點的最大路徑
參考部落格 傳送門 問題 如何求二叉樹兩個節點的最大路徑 思路 分為兩種情況 1 路徑經過根節點 2 路徑不經過根節點,是其左右子樹的最大路徑 比較這兩種情況,去較大的即為最後結果 1 include 2 3using namespace std 45 struct node 9struct res...
二叉樹 查詢兩個任意節點的最近祖先
很久沒有用過二叉樹了,最近由於需要用到了,發現很多知識需要鞏固了,中間涉及到乙個演算法就是找任意兩個節點的最近祖先。通過本人回顧和演算,最終提出了下面乙個方法,網上也有很多其他的方式實現,再次僅對自己好幾個小時的工作作個記錄和積累吧!程式是用c語言寫的,個人覺得如果用c 實現會更加方便。首先是資料結...