void findparent(node* root, node* pt1, node* pt2);
1、對於二叉搜尋樹,裡邊的元素都是排好序的,那麼從根節點向下搜尋,找到第乙個節點p滿足p->data > pt1->data 且 p->data < pt2->data(假定pt1->data < pt2->data)即是滿足要求的公共父節點;
節點結構:
struct node{
int data;
node *left, *right;
2、對於有指向父節點指標的二叉樹,那麼通過回溯找到根節點並對遍歷過的節點予以儲存,找到第乙個相同的即是公共父節點。如果元素互異,儲存元素以作比對即可,否則儲存指標(位址)做比對;
這種情況下,樹的節點結構應為:
struct node{
int data;
node *left, *right, *parent;
3、對於既沒有排序,也沒有父指標的一般情況,可以多費一些空間,將此樹當作完全二叉樹存入陣列,那麼每乙個根節點與子節點的索引關係應為(k, 2k, 2k+1)當我們遍歷到待查父節點的元素時記錄其索引,將其索引依次除2,直到1,即全樹的根節點。對於兩個樹同樣操作,我們就能找到對應的共同父節點了。需要注意的是,我們沒有必要儲存所有的樹節點,只需儲存到包含兩個待查父節點的節點即可。
節點結構:
struct node{
int data;
node *left, *right;
二叉樹 最近公共父節點
給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...
二叉樹近期公共父節點
在二叉樹中找近期公共父節點。分為兩種情況,一種是有父指標,一種沒有父指標。這樣的情況比較簡單。計算兩個結點的深度,再把深度大的向上移。移到同一深度。在同一時候向上移動,直到兩個結點同樣,這樣便找到了父節點。這個演算法時間複雜度為o n 實現 includestruct node int getdpe...
二叉樹的最近公共父節點
給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。給出的兩個節點一定在樹中存在 結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。此題可參考leetcode 236。考慮兩個結點的存在情況 乙個節點為是另外乙個節點的子或孫子節點,此時...