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

2022-03-22 22:21:16 字數 1399 閱讀 8033

如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 " 距離 " 為兩節點之間邊的個數。寫乙個程式,求一棵二叉樹中相距最遠的兩個節點之間的距離,求二叉樹中節點的最大距離

分析:先畫幾個不同形狀的二叉樹,從例子中可以看出,相距最遠的兩個節點,一定是兩個葉子節點,或者是乙個葉子節點到它的根節點:

根據相距最遠的兩個節點一定是葉子節點這個規律,我們可以進一步討論。 對於任意乙個節點,以該節點為根,假設這個根有 k 個孩子節點,那麼相距最遠的兩個節點 u和v之間的路徑與這個根節點的關係有兩種情況:

1. 若路徑經過根root,則u和v是屬於不同子樹的,且它們都是該子樹中到根節點最遠的節點,否則跟它們的距離最遠相矛盾。

2. 如果路徑不經過root,那麼它們一定屬於根的k個子樹之一。並且它們也是該子樹中相距最遠的兩個頂點。

所以,只需要計算這兩種情況的路徑距離,並取其大者,就是該二叉樹的最大距離。

遞迴:

1. 先弄清楚遞迴的順序。在遞迴的實現中,往往需要假設後續的呼叫已經完成,在此基礎之上,才實現遞迴的邏輯。在該題中,我們就是假設已經把後面的長度計算出來了,然後繼續考慮後面的邏輯;

2. 分析清楚遞迴體的邏輯,然後寫出來。比如在上面的問題中,遞迴體的邏輯就是如何計算兩邊最長的距離;

3. 考慮清楚遞迴退出的邊界條件。也就說,哪些地方應該寫return。

注意到以上 3 點,在面對遞迴問題的時候,我們將總是有章可循。 

經過以上的分析,我們可以看出,情況1及2需要不同的資訊: 情況1需要子樹的最大深度,情況2需要子樹的最大距離。只要函式能在乙個節點同時計算及傳回這兩個資訊,**就可以很簡單:

int maxdistance(node * root)

int helper(node * root, int &depth)

int ld, rd;

int maxleft = helper(root->left, ld);

int maxright = helper(root->right, rd);

depth = max(ld, rd)+1;

return max(maxleft, max(maxright, ld+rd));

}

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

遞迴求解,最大距離總是在一下兩種情況產生 情況1 最大路徑經過root 這個例子中,最長路徑經過root,其距離等於左子樹的高度 1 右子樹的高度 1 在這種情況下 如果只有左子樹,右子樹為空 最大距離 左子樹的高度 1 如果只有右子樹,左子樹為空 最大距離 右子樹的高度 1 如果既有右子樹,又有左...

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

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...