樹 二叉樹任意兩個節點之間路徑的最大長度

2021-09-25 08:39:38 字數 787 閱讀 4413

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 實現會更加方便。首先是資料結...