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

2021-09-06 05:46:03 字數 1666 閱讀 3122

1.問題描述

寫乙個程式求一棵二叉樹相距最遠的兩個節點之間的距離

如下圖:

2.分析與解法

對於任意乙個節點,以該節點為根,假設這個根有k個孩子節點,那麼距離最遠的兩個節點u與v之間的路徑與這個根節點的關係有兩種。

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

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

因此,問題就可以轉化為在字數上的解,從而能夠利用動態規劃來解決。

設第k棵子樹中相距最遠的兩個節點:uk和vk,其距離定義為d(uk,vk),那麼節點uk或vk即為子樹k到根節點rk距離最長的節點。不失一般性,我們設uk為子樹k中道根節點rk距離最長的節點其到根節點的距離定義為d(uk,r)。取d(ui,r)(1<=i<=k)中最大的兩個值max1和max2,那麼經過根節點r的最長路徑為max1+max2+2,所以樹r中相距最遠的兩個點的距離為:max。

3.**實現

程式設計之美給出的**如下:

//

資料結構定義

struct

node;

int nmaxlen=0;//

尋找樹中最長的兩段距離

void findmaxlen(node*proot)

//如果左子樹為空,那麼該節點的左邊最長距離為0

if(proot->pleft==null)

//如果右子樹為空,那麼該節點的右邊最長距離為0

if(proot->pright==null)

//如果左子樹不為空,遞迴尋找左子樹最長距離

if(proot->pleft!=null)

//如果右子樹不為空,遞迴尋找右子樹最長距離

if(proot->pright!=null)

if(proot->pleft!=null)

else

proot->nmaxleft=ntempmax+1

; }

//計算右子樹最長節點距離

if(proot->pright!=null)

else

proot->nmaxright=ntempmax+1

; }

//更新最長距離

if(proot->nmaxleft+proot->nmaxright >nmaxlen)

}

依據二叉樹尋找最大深度的常規思想,又有**如下:

struct

btnode

;int maxdis = -1

;int findmaxdis(btnode*proot)

return maxleft > maxright ? maxleft+1 : maxright+1

;}

後一段**為自寫 沒有驗證其正確性。

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

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

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

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

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

如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩節點之間邊的個數。寫乙個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。include using namespace std struct node int nmaxlen 0 尋找樹中最長的兩段距離 void f...