二叉樹中節點的最大的距離(程式設計之美3 8)

2021-09-06 13:54:56 字數 1336 閱讀 6780

問題定義

把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義「距離」為兩個節點之間的邊數。例如下圖中最大距離為紅線的條數為6.

分析

定義:過以節點x作為根節點的子樹中,節點間的最大距離為dis(x)。

上圖,左圖中dis(根節點)最大,右圖中dis(根節點->left)最大。從上邊可以看出每個節點都可能成為最大距離根節點的潛質。

因此可以求出每個dis(節點),從中得出最大值即為整個二叉樹的根節點最大值。

在求過點x的最大距離時,最大距離的兩個點有可能出現在三種情況下

左子樹右子樹

過節點x

經分析得出以下特點

以上三種情況最終必定一葉子結束

在第三種情況下必然是左子樹高度 與 右子樹高度 之和(只有這樣,才可能取得最大值)

經過以上分析即可得出遞推式

dis(x) = max(dis(x->left), dis(x->right), height(x->left)+height(x->right))

參考**

int

treedistance(bitree root)

這裡用了乙個技巧:maxdis是個全域性變數,遞迴一次根節點會遍歷到每個節點,在這期間於maxdis比較,從而得出了最大值,而不需要額外的空間。

完整執行**

#includeusing

namespace

std;

typedef

struct

bitnode

bitnode, *bitree;

int maxdis = 0

;void createtree(bitree &root)

void

deletetree(bitree root)

}int

height(bitree root)

int max(int a, int b, int

c)int

treedistance(bitree root)

intmain()

view code

結果

4

程式設計之美 求二叉樹中節點的最大距離

1.問題描述 寫乙個程式求一棵二叉樹相距最遠的兩個節點之間的距離 如下圖 2.分析與解法 對於任意乙個節點,以該節點為根,假設這個根有k個孩子節點,那麼距離最遠的兩個節點u與v之間的路徑與這個根節點的關係有兩種。1 若路徑經過root,則u和v屬於不同子樹的,且它們都是該子樹中到根節點最遠的節點,否...

程式設計之美 求二叉樹中節點的最大距離

1.問題描述 寫乙個程式求一棵二叉樹相距最遠的兩個節點之間的距離 如下圖 2.分析與解法 對於任意乙個節點,以該節點為根,假設這個根有k個孩子節點,那麼距離最遠的兩個節點u與v之間的路徑與這個根節點的關係有兩種。1 若路徑經過root,則u和v是屬於不同子樹的,且它們都是該子樹中到根節點最遠的節點,...

程式設計之美 求二叉樹中節點的最大距離

如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩節點之間邊的個數。寫乙個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。解法 用遞迴的方法 1 資料結構定義 2struct node3 1011 int nmaxlen 0 12 13 尋找樹中最長的兩段距離 14...