求二叉樹中節點的最大距離

2021-05-28 11:32:59 字數 1312 閱讀 2718

遞迴求解,最大距離總是在一下兩種情況產生

情況1:  最大路徑經過root

這個例子中,最長路徑經過root, 其距離等於左子樹的高度 + 1 + 右子樹的高度 + 1

在這種情況下:

如果只有左子樹,右子樹為空

最大距離 = (左子樹的高度 + 1)

如果只有右子樹,左子樹為空

最大距離 = (右子樹的高度 + 1)

如果既有右子樹,又有左子樹

最大距離 = (左子樹的高度 + 1) + (右子樹的高度 + 1)

情況2: 最大路徑不經過root

這個例子中,最長路徑不經過root, 最長路徑全部在右子樹中。

在這種情況下:

最大距離 = max

綜合以上兩種情況:

最大距離 = max

**如下:

#include #include #include #define max(a,b) ((a) > (b) ? (a) : (b))

typedef struct node_tnode_t;

/* 先序建立二叉樹 */

node_t *create_tree()

/* 遞迴求樹的最大距離和高度 */

int find_max_dist(node_t *root, int *height)

/* 情況2,最大路徑不經過root,最大路徑在子樹中產生 */

left_dist = find_max_dist(root->left, height);

lh = *height;

right_dist = find_max_dist(root->right, height);

rh = *height;

*height = max(lh, rh) + 1;

max_dist = max(left_dist, right_dist);

/* 情況1,經過root,最大距離等於左右子樹的高度加上2,

* 遞迴的過程中,順便求出根節點的高度 */

int dist = 0;

if (root->left != null)

if (root->right != null)

/* 最大距離在情況1和情況2中產生 */

max_dist = max(dist, max_dist);

return max_dist;

}int main()

測試輸入

輸入:   1 2 4 -1 -1 5 -1 -1 3 -1 -1

生成的二叉樹為:

求出最大距離等於 3

求二叉樹中節點的最大距離

2010 10 26 16 03 37 分類 資料結構與演算法 標籤 proot 節點pleft pright nmaxleft 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...

求二叉樹中節點的最大距離

如果我們把二叉樹看成乙個圖,父子之間的連線看成,姑且定義 距離 為兩個之間邊的個數。求一顆二叉樹中相距最遠兩個點之間的距離。struct node bittree int nmaxlen 0 void findmaxlen node proot if proot pleft null if proo...

求二叉樹中節點的最大距離

今天中午的時候有人問了我乙個問題 求二叉樹中節點的最大距離。這是 程式設計之美 上的乙個問題。花了一中午的時間總算解決了這個問題,有一點是很明確的 如果把樹看做是乙個圖的話,它必然是連通的,任一節點總有路徑到其他任何節點,這個題目就是求這樣最長的一條路徑。距離最大的兩個節點可能是乙個在左子樹,乙個在...