寫乙個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。
粗箭頭的邊表示最長距離。
相距最遠的兩個節點,一定是兩個葉子節點,或者是乙個葉子節點到它的根節點(單枝樹)。
我們來考慮相距最遠的兩個節點是兩個葉子節點的情況。
對於任意乙個節點,以該節點為根,假設這個根有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 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...