[color=violet][size=xx-large]求二叉樹中節點的最大距離[/size][/color]
求二叉樹中節點的最大距離,兩個節點的距離的定義是這兩個節點間邊的個數,比如某個孩子節點和父節點間的距離是1,和相鄰兄弟節點間的距離是2。
這是論壇上的一道演算法題,我目前想到的解法是:
二叉樹中任意兩個節點間的最大距離,那麼其中乙個節點必定是層次最深的乙個節點,記該節點為a。該二叉樹中層次最深的節點可能有多個,但只需要選擇其中乙個記為a。找出了a,那麼遍歷二叉樹中其它非a的節點,訪問各節點的時候求出該節點到a的距離,從而記錄下求到的最大距離。[color=green][size=large]因此題目可以轉化為:求乙個二叉樹中,給定的兩個節點間的距離。[/size][/color]
首先就要求出這兩個不同的節點間的公共父節點,這個題目出過多次了,解法是:
假設兩個節點為a和b,中序遍二叉樹,遍歷的時候記錄下各節點的層次深度,同時,遇到a或者b的時候開始記錄層次最淺的節點,直到遇到b或者a的時候,或者遇到根節點(層次深度為0)的時候,終止記錄。那麼,記錄下來的層次最淺的節點就是a和b的公共父節點。
[color=green]這個求公共父節點演算法的原理是a和b的公共父節點必在中序遍歷後的a和b之間。[/color]
如果求得兩個不同節點(記為a和b)之間的公共父節點(記為p),那麼事情就很簡單了,a和b之間的距離就是a和p之間的距離,加上b和p之間的距離,也就是a和p之間的層次差,與b和p之間的層次差,它們兩者之和。
這只是乙個初步的演算法,遠遠算不上高效,因為找到a之後,還需要兩次巢狀遍歷二叉樹,外層是求各個節點到a的距離,內層是求各個節點與a的公共父節點。正因為如此,應該存在巨大的優化空間。
**
求二叉樹中節點的最大距離
遞迴求解,最大距離總是在一下兩種情況產生 情況1 最大路徑經過root 這個例子中,最長路徑經過root,其距離等於左子樹的高度 1 右子樹的高度 1 在這種情況下 如果只有左子樹,右子樹為空 最大距離 左子樹的高度 1 如果只有右子樹,左子樹為空 最大距離 右子樹的高度 1 如果既有右子樹,又有左...
求二叉樹中節點的最大距離
2010 10 26 16 03 37 分類 資料結構與演算法 標籤 proot 節點pleft pright nmaxleft 字型大小 大中小訂閱 如果我們把二叉樹看成乙個圖,父子節點之間的連線看成是雙向的,我們姑且定義 距離 為兩個節點之間邊的個數。寫乙個程式求一顆二叉樹中相距最遠的兩個節點之...
求二叉樹中節點的最大距離
如果我們把二叉樹看成乙個圖,父子之間的連線看成,姑且定義 距離 為兩個之間邊的個數。求一顆二叉樹中相距最遠兩個點之間的距離。struct node bittree int nmaxlen 0 void findmaxlen node proot if proot pleft null if proo...