題目:
把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義「距離」為兩個節點之間的邊數。
求一顆二叉樹中的兩個節點之間的距離的最大值。
方法一:用書上寫的方法:
**:
struct node ;
int nmaxlength = 0;
void findmaxdistance(node *root)
if(root->right != null)
if(root->nmaxleft + root->nmaxright > nmaxlength) nmaxlength = root->nmaxleft + root->nmaxright;
}
方法二:
定義:經過節點x作為根節點的子樹中,節點間的最大距離為dis(x)。
在求過點x的最大距離時,最大距離的兩個點有可能出現在三種情況下
左子樹右子樹過節點x
經分析得出以下特點
以上三種情況最終必定一葉子結束
在第三種情況下必然是左子樹高度 與 右子樹高度 之和(只有這樣,才可能取得最大值)
經過以上分析即可得出遞推式
dis(x) = max(dis(x->left), dis(x->right), height(x->left)+height(x->right))
**:
struct node ;
int maxlength = 0;
int height(node *root)
int findmaxdistance(node *root)
方法三:
思路:利用深度優先遍歷的方法。
這兩點必然在以某個節點
a為根的子樹上,它們間的路徑必然經過該子樹的根節點a。
因而,以任意乙個節點為根的子樹,計算出經過該子樹根節點的最大距離,則所有最大距離的最大值就是所要求的最大距離。
而經過乙個樹的根節點的最大距離
=左子樹的高度
+右子樹的高度
+2(假設空節點的高度為
-1),因而可以用乙個全域性變數
max_d
儲存最大距離,採用深度優先遍歷,每遍歷乙個節點,計算出左右子樹的高度,計算出其高度,並將經過該節點的最大距離值與
max_d
值比較,並更新
max_d,
當遍歷完所有節點時,
max_d
就是所求的最大距離。
**:
int maxlen = 0;
int findmaxdistance(node *root, int &maxlen)
3 8求二叉樹中節點的最大距離
寫乙個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。粗箭頭的邊表示最長距離。相距最遠的兩個節點,一定是兩個葉子節點,或者是乙個葉子節點到它的根節點 單枝樹 我們來考慮相距最遠的兩個節點是兩個葉子節點的情況。對於任意乙個節點,以該節點為根,假設這個根有k個孩子節點,那麼相距最遠的兩個節點u和v之間的...
求二叉樹中節點的最大距離
遞迴求解,最大距離總是在一下兩種情況產生 情況1 最大路徑經過root 這個例子中,最長路徑經過root,其距離等於左子樹的高度 1 右子樹的高度 1 在這種情況下 如果只有左子樹,右子樹為空 最大距離 左子樹的高度 1 如果只有右子樹,左子樹為空 最大距離 右子樹的高度 1 如果既有右子樹,又有左...
求二叉樹中節點的最大距離
2010 10 26 16 03 37 分類 資料結構與演算法 標籤 proot 節點pleft pright nmaxleft 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...