比如:在如圖這棵二叉樹中,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已知 思路 有...