题目:EPI
以下解法要求a,b节点必须在树内。
shared_ptr<treenode> LCA(const shared_ptr<treenode> &root, const shared_ptr<treenode> &a, const shared_ptr<treenode> &b)
{
if (root == nullptr || a == nullptr || b == nullptr)
return nullptr;
if (root == a || root == b)
return root;
shared_ptr<treenode> l_res = LCA(root->left, a, b);
shared_ptr<treenode> r_res = LCA(root->right, a, b);
if (l_res && r_res)
return root;
else
return l_res ? l_res : r_res;
}
进阶:在BST中寻找两个节点的最低公共祖先,要求BST内的数据域没有重复值。
shared_ptr<treenode> LCA_of_BST(const shared_ptr<treenode> &root, const shared_ptr<treenode> &a, const shared_ptr<treenode> &b)
{
if (root == nullptr || a == nullptr || b == nullptr)
return nullptr;
int aa = a->data > b->data ? b->data : a->data;//小
int bb = a->data > b->data ? a->data : b->data;//大
shared_ptr<treenode> cur = root;
while (cur)
{
if (cur->data < aa)
cur = cur->right;
else if (cur->data > bb)
cur = cur->left;
else
return cur;
}
return nullptr;
}