二叉樹中節點的最大距離(樹的最長路徑) 遞迴解法

2021-06-26 03:09:43 字數 1108 閱讀 4075

現在我給出原題的一種遞迴解法。將會看到,現比較上篇博文,今天給出的遞迴解法的**實現是相當簡潔的。

如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義"距離"為兩節點之間邊的個數。

寫乙個程式,求一棵二叉樹中相距最遠的兩個節點之間的距離。測試用的樹:

n1/             \

n2             n3

/        \

n4          n5

/     \         /   \

n6    n7    n8    n9

/                       /

n10                 n11

上篇博文我們用到了樹的深度depth。而在遞迴解決此題的思考中,我發現用樹的高度要比用深度簡便得多。

這是因為:

對於乙個葉節點,它子樹(儘管沒有)的高度可以認為是0,它自己的高度是1,很容易區分。若是用深度,則都是0,會帶來一些繁瑣的判斷。

題目就是求一棵樹中的最長路徑

對於節點t,以它為根的樹的最長路徑path一定是下列三個數中的最大值

①t的左子樹的最長路徑lpath

②t的右子樹的最長路徑rpath

③t的左子樹的高度+t的右子樹的高度 ——

結論1

為了簡潔優美,我盡量簡化了**,可能犧牲了一點易讀性、增加了一些操作(如強行拼出來的那一長串return語句。。)

值得注意的是,程式中**的順序不能改變,因為對t->floor賦值的前提是t的左右子樹的高度已知,它們由前兩行遞迴**已經順帶求出。因此順序不能更改!!

節點:

//節點結構體

struct binarytreenode

;

關鍵**:

//查詢最大路徑,返回路徑長度

int findmaxpath(binarytreenode* t)

return 0;

}

二叉樹中節點的最大距離

二叉樹中距離最長的兩個節點一定是葉子節點或根節點,假設有乙個節點不是葉子節點或根節點,那麼其父親或者其兒子到另外乙個節點的距離比最大距離要大,所以假設錯誤。如果距離最長的兩個節點有乙個是根,那麼最長距離就等於樹的高,而且根只有乙個兒子,否則一定存在更長的距離。對於某乙個節點,設其左兒子和右兒子的高度...

二叉樹中節點的最大距離

如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩節點之間邊的個數。寫乙個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。書中對這個問題的分析是很清楚的,我嘗試用自己的方式簡短覆述。計算乙個二叉樹的最大距離有兩個情況 只需要計算這兩個情況的路徑距離,並取其大者,就是...

二叉樹中節點的最大距離

節點間的距離定義 節點之間的路徑長度。二叉樹中最大的路徑長度有三種情況 1.最大路徑長度出現在左子樹中 2.最大路徑長度出現在右子樹中 3.最大路徑長度由根節點 右子樹中的最深葉子節點 左子樹中的最深葉子節點構成 下列 大致演示了求解的過程。int maxdistanc treenode root,...