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

2021-08-04 14:25:16 字數 1248 閱讀 1442

比如:在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。

在上述分析中,我們可以得出思路,本題解法可分為兩種情況,(1)兩個節點在根節點同側 ,則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。

(2)兩個節點在根節點的不同側,則它們的公共祖先只能是根節點。

同時,這棵樹又分為三種情況:

(1)這棵樹是搜尋樹

(2)這棵樹中有三叉鏈

(3)它只是一棵普通的二叉樹

templatet>

struct binarytreenode

};

1,這棵樹是搜尋樹:根據搜尋樹的性質,它的所有左子樹小於根節點,所有右子樹大於根節點。

時間複雜度o(n)

node* getcommonancestor(node* root,node* x1, node* x2)

2,普通二叉樹

時間複雜度o(n^2)

node* getcommonancesstor(node* root, node* x1,node*x2)

}

優化為o(n)

node* getnodepath(node* root,stack

& s, node* x)

node* getnodeancestor(node* root, node* x1, node* x2)

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

return s1.top();

}

3,這棵二叉樹中有三叉鏈

templatet>

struct binarytreenode

};

node* getcommenancesstor(node* root, node* x1, node* x2)

while (cur2->_parent)

node* node = null;

while (!s1.empty() && !s2.empty())

return node;

}

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

要求考慮以下三種種情況,給出解決方案,並解決 1 二叉樹是搜尋二叉樹。2 二叉樹每個節點有parent 三叉鏈 treenode publiclowparent treenode root,treenode c1,treenode c2 else if c1 data cur data c2 dat...

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

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

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

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