二叉樹中節點的最大距離

2021-06-18 20:00:59 字數 1438 閱讀 9197

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

書中對這個問題的分析是很清楚的,我嘗試用自己的方式簡短覆述。

計算乙個二叉樹的最大距離有兩個情況:

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

// 資料結構定義

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)

}

這段**有幾個

缺點:

1、演算法在二叉樹結構體中加入了侵入式(intrusive)的變數nmaxleft, nmaxright

2、使用了全域性變數 nmaxlen。每次使用要額外初始化

3、邏輯比較複雜,也有許多 null 相關的條件測試

//return maxdistance of t

int maxdistance(tree * t)

//returns height of tree with root t

int height(tree * t)

二叉樹中節點的最大距離

二叉樹中距離最長的兩個節點一定是葉子節點或根節點,假設有乙個節點不是葉子節點或根節點,那麼其父親或者其兒子到另外乙個節點的距離比最大距離要大,所以假設錯誤。如果距離最長的兩個節點有乙個是根,那麼最長距離就等於樹的高,而且根只有乙個兒子,否則一定存在更長的距離。對於某乙個節點,設其左兒子和右兒子的高度...

二叉樹中節點的最大距離

節點間的距離定義 節點之間的路徑長度。二叉樹中最大的路徑長度有三種情況 1.最大路徑長度出現在左子樹中 2.最大路徑長度出現在右子樹中 3.最大路徑長度由根節點 右子樹中的最深葉子節點 左子樹中的最深葉子節點構成 下列 大致演示了求解的過程。int maxdistanc treenode root,...

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

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