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

2021-07-12 05:40:51 字數 1778 閱讀 9720

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

粗箭頭的邊表示最長距離。

相距最遠的兩個節點,一定是兩個葉子節點,或者是乙個葉子節點到它的根節點(單枝樹)。

我們來考慮相距最遠的兩個節點是兩個葉子節點的情況。

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

1.若路徑經過根節點,那麼節點u和v屬於兩個不同的子樹。那麼就有u和v都是它們所在子樹到根節點最遠的節點。

2.若路徑不經過根節點:

那麼節點u和v一定屬於根節點的k個子樹之一。同時滿足,它們是子樹中相距最遠的兩個節點。

此時問題就能轉化成在子樹上的解,用動態規劃,自底向上。

樹r有k棵子樹

設第k棵子樹中相距最遠的兩個節點: uk和vk。

d(uk,vk)為子樹k的最大距離。

假設uk為子樹k中到子樹k的根節點rk的距離最長的節點。

那麼其到樹的根節點r的距離定義為d(uk,r)。

選出d(ui,r)(1≤i≤k)中最大的兩個值max1,max2,那麼經過根節點r的最長路徑為max1+max2+1。

所以樹r中相距最遠的兩個節點的距離為:

max。

#include

#include

#include

#include

<

string

.h>

#include

#include

<

stack

>

using namespace std;

struct treenode

};void createbinarytree(treenode*

&root)

root =

new treenode(ch);

createbinarytree(root->left);

createbinarytree(root->right);

}//遞迴

void findmaxlen(treenode* root,int &maxlen)

if (root->right !=

null)

maxlen =

max(maxlen,root->maxlenleft+root->maxlenright+

1); }

}//非遞迴

void findmaxlen_nonrecursive(treenode* root,int &maxlen)

cur = s.top();

//如果當前節點的右孩子為空,或者右孩子被訪問過,那麼訪問當前節點

if (cur->right ==

null

|| cur->right == pre)

if (cur->right !=

null)

maxlen =

max(maxlen,cur->maxlenleft+cur->maxlenright+

1); s.pop();

pre = cur;

cur =

null;

}else}}

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

題目 把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,定義 距離 為兩個節點之間的邊數。求一顆二叉樹中的兩個節點之間的距離的最大值。方法一 用書上寫的方法 struct node int nmaxlength 0 void findmaxdistance node root if root ri...

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

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

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

2010 10 26 16 03 37 分類 資料結構與演算法 標籤 proot 節點pleft pright nmaxleft 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...