問題定義
把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義「距離」為兩個節點之間的邊數。例如下圖中最大距離為紅線的條數為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這裡用了乙個技巧:maxdis是個全域性變數,遞迴一次根節點會遍歷到每個節點,在這期間於maxdis比較,從而得出了最大值,而不需要額外的空間。treedistance(bitree root)
完整執行**
結果
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...