求二叉樹中兩個節點的最近公共祖先

2021-08-04 20:15:21 字數 1191 閱讀 6840

要求考慮以下三種種情況,給出解決方案,並解決:

1:二叉樹是搜尋二叉樹。

2: 二叉樹每個節點有parent(三叉鏈)

treenode* publiclowparent(treenode *root, treenode*c1, treenode* c2)

else

if (c1->

data

< cur->

data

&&c2->

data

< cur->

data)

else

return cur;

}}

針對第二種情況

以前遇到過2個單鏈表相交求交點的問題,此時我們可以借鑑當時的鍊錶求交點的辦法,來尋找2個節點所在鍊錶的交點,即為公共最近公共祖先。鍊錶求交點,如果2個鍊錶長度不相等,要將長鍊錶縮短,直到與短鍊錶的長度相等為止。

int getlen(treenode *root,treenode* node)

return count;

}treenode* publiclowparent(treenode *root, treenode*c1,treenode* c2 )

}//p2比p1長,p2先走多餘的長度步

else

}//此時鍊錶長度一樣,一起向後走

while (p1 != p2)

//跳出迴圈時即為2鍊錶相交點

return p1;

}

對於第三種情況,我們借助棧來實現,儲存這2個節點從根結點開始到他們的路徑,根據棧中的資料來判斷最近的公共交點,同樣也用到了鍊錶的求交點的思想

//從根結點開始找尋節點,將路徑中的節點分別進行壓棧

bool getpath(treenode* root, treenode* node, stack

& s)

return

true;

}}treenode* publiclowparent(treenode *root, treenode*c1, treenode* c2)

}else

}while (!s1.empty() && !s2.empty() && s1.top() != s2.top())

return s1.top();

}

求二叉樹中兩個節點的最近公共祖先

比如 在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我們可以得出思路,本題解法可分為兩種情況,1 兩個節點在根節點同側 則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。2 兩個節點在根節點的不同側,則它們的公共祖先只能是...

求二叉樹兩個節點的最近公共祖先

偶然看到乙個特別特別巧妙的方法,在此記錄一下 typedef struct xbnodexbnode,xbtree 取名叫xbtree是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...

二叉樹中兩個節點的最近公共父節點

這個問題可以分為三種情況來考慮 情況一 root未知,但是每個節點都有parent指標 此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個鍊錶,然後求兩個鍊錶的第乙個公共節點,這個方法很簡單,不需要詳細解釋的。情況二 節點只有左 右指標,沒有parent指標,root已知 思路 有...