如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義」距離」為這條路徑上所有節點的value和。寫乙個程式求一棵二叉樹中最大的路徑距離。
對於這個圖,最大的路徑是從5—-3—-7,距離為15的路徑。
採用後序遍歷,對於每乙個節點儲存經過當前節點的單邊路徑的最大距離,定義為single_max,為什麼只儲存單邊距離:對於當前節點的父節點來說,路徑只能來自於單邊:
定義乙個全域性變數 max_path,儲存最大路徑。
1. 對於葉節點,單邊最大距離就是它本身,node.single_max=node.value
2. 對於非葉節點,如果左右子節點都存在的話:
經過左孩子到達當前節點的最大距離:
left_max=max(node.left.value, node.left.single_max)
經過右孩子到達當前節點的最大距離:
right_max=max(node.right.value, node.right.single_max)
從子節點到當前節點的最大單邊距離:
node.single_max=max(node.value, node.value+max(left_max, right_max))
更新可能的最大距離
current_max=max(node.value, node.single_max)
max_path=max(current_max, current_max+left_max+right_max)
3.對於非葉節點,如果左右子節點只存在乙個,還是按照第二條的邏輯去處理。
遞迴前面的步驟到達根節點,即可求出最終的最大距離:
}這個問題其實是leetcode 的124. binary tree maximum path sum
/* 這道題是求樹的路徑和的題目,不過和平常不同的是這裡的路徑不僅可以從根到某乙個結點,
* 而且路徑可以從左子樹某乙個結點,然後到達右子樹的結點,就像題目中所說的可以起始和終結於任何結點。
* 可以用0作為返回值,這樣就不用區別有沒有子樹的情況了。
* 演算法的本質還是一次樹的遍歷,所以複雜度是o(n)。而空間上仍然是棧大小o(logn)。
*/
/**
* definition for binary tree
* struct treenode
* };
*/class solution
int maxpathhelper(treenode *root,int &max_sum)
};
求二叉樹中兩個節點的最大距離
二叉樹節點的結構體定義如下 struct btreenode 使用遞迴的方式,遍歷二叉樹,然後從葉子節點開始修改結構體中的 maxleft 和 maxright 變數,直至回溯到根節點。詳細的 如下 include using namespace std 將節點儲存的資料型別設為整型 typedef...
二叉樹兩個節點之間的最大距離
二叉樹兩個節點之間的最大距離,以根節點分析,最大距離可能有3種情況 左左 右右 左右 左左相當於求左子樹上的遞迴子問題,右右相當於求右子樹的遞迴子問題。左右是需要我們處理的問題。我們使用record陣列來記錄左邊的最大值和右邊的最大值。includeusing namespace std struc...
二叉樹兩個節點的最大路徑
參考部落格 傳送門 問題 如何求二叉樹兩個節點的最大路徑 思路 分為兩種情況 1 路徑經過根節點 2 路徑不經過根節點,是其左右子樹的最大路徑 比較這兩種情況,去較大的即為最後結果 1 include 2 3using namespace std 45 struct node 9struct res...