二叉樹的公共節點

2021-07-10 21:38:17 字數 2591 閱讀 7638

情況1. 節點只有left/right,沒有parent指標,root已知

情況2. root未知,但是每個節點都有parent指標

情況3. 二叉樹是個二叉查詢樹,且root和兩個節點的值(a, b)已知

雖然情況一是第乙個情況,但是看上去比較複雜,我們放到最後來說,先從第二個情況開始說。

/       \

6         14

/  \       /   \

4   8   12   16

3   5

畫乙個二叉樹來做例子。如果我們要找3和8這兩個節點的公共父親節點,我們的做法是首先找到3到根節點的路勁,然後找到8到根節點的路徑。

//      \

6         14

/\        /  \

4   8   12   16

/  \

3   5

3的路徑用紅色表示,8的用綠色表示,可以看到, 這裡的問題實際上是另乙個我們熟知的問題,有2個相交的單鏈表,找出它們的相交點!

只要把這個二叉樹的倒過來看,或者把脖子倒過來看就知道了:)那個方法也是傳統的求出linkedlist a的長度lengtha, linkedlist b的長度lengthb。然後讓長的那個鍊錶走過abs(lengtha-lengthb)步之後,齊頭並進,就能解決了。

[cpp]view plain

copy

print

?int getlength (bstnode* pnode)  

return length;  

}  bstnode* findlcacase2(bstnode* pnode1, bstnode* pnode2)  

piter1 = ptemp;  

piter2 = pnode2;  

}  else

piter1 = pnode1;  

piter2 = ptemp;  

}  while (piter1&&piter2&&piter1!= piter2)  

return piter1;  

}  

其他地方copy的乙個程式:

[cpp]view plain

copy

print

?template

struct treenode1  

;  #include 

// 找尋節點路徑,倒序,根節點在最後

template

bool findnodepath(treenode1* proot, treenode1* p, std::vector*>& path)  

else

if(findnodepath(proot->plchild, p, path))  

else

if(findnodepath(proot->prchild, p, path))  

return

false;  

}  template

treenode1* findnearestparentnode(treenode1* proot, treenode1* p1, treenode1* p2)  

}  return preturn;  

}  

情況三,如果是個二叉搜尋樹,而且root和a, b已知,我們這個case假設a,b=3,8。從知道根這個條件我們很自然聯想到遞迴(當然不遞迴也可以)地往下找。關鍵是收斂條件,什麼情況下可以判斷出當然檢查的這個節點是最近父親節點呢?其實從這個例子已經可以看出一些端倪了,如果當前訪問的節點比a,b來的都小,肯定不行。如果比a,b都大,也不行。那也就是說,這個節點只有在a<=node<=b的區間內才成立(我們假定a[cpp]view plain

copy

print

?#include 

bool nodepath (bstnode* proot, int value, std::vector& path)  

else

else

return

false;  

}  }  

else

}  bstnode* findlcacase1(bstnode* pnode, int value1, int value2)  

}  }  return preturn;  

}  

遞迴的方法:

只要找到這樣乙個節點:

已知的兩個節點乙個在它的左邊子樹,乙個在它的右邊子樹;

或者這個節點就是已知的兩個節點中的乙個,而另乙個恰好在它的下面。

[cpp]view plain

copy

print

?tree* commonfather(tree *root, tree *a, tree *b)    

令:先比較兩結點的深度,把大的先往上推,直到兩結點深度一致,然後它們兩就是同輩兒啦,不是兄弟就是表兄弟,往上一起推算,一直推到共同的第乙個老子。

求a b的最近的父節點,首先求根節點到a的路徑字串,再求根節點到b的路徑字串,不用管樹的構造有沒有father pointer。

二叉樹的公共父節點

void findparent node root,node pt1,node pt2 1 對於二叉搜尋樹,裡邊的元素都是排好序的,那麼從根節點向下搜尋,找到第乙個節點p滿足p data pt1 data 且 p data pt2 data 假定pt1 data pt2 data 即是滿足要求的公共...

二叉樹 最近公共父節點

給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...

二叉樹近期公共父節點

在二叉樹中找近期公共父節點。分為兩種情況,一種是有父指標,一種沒有父指標。這樣的情況比較簡單。計算兩個結點的深度,再把深度大的向上移。移到同一深度。在同一時候向上移動,直到兩個結點同樣,這樣便找到了父節點。這個演算法時間複雜度為o n 實現 includestruct node int getdpe...