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

2021-07-02 06:41:10 字數 1341 閱讀 1542

題目:

把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義「距離」為兩個節點之間的邊數。

求一顆二叉樹中的兩個節點之間的距離的最大值。

方法一:用書上寫的方法:

**:

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 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...