在一棵二叉树中任意指定两节点,求这两节点的最近共同祖先,即LCA问题。
后序遍历解法:
Case 1::两节点没有血缘关系,即其中一节点不是另一节点的父辈或子辈,则它们必定在共同祖先的不同子树上。也就是说,如果一个节点的左子树能找到一节点,其右子树能找到另一个节点,则这个节点就是该两节点的共同祖先。
Case 2:两节点有血缘关系,则返回深度较小的那个节点的父节点。
以下是算法代码,适用情况:二叉树中没有与指定节点相同的节点。
bool LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult,TNode * parent)
{
if (!root)
{
return false;
}
//L查看左子树能否找到其中一个节点
bool falg1=LCA(root->left,node1,node2,restult,root);
//R查看右子树能否找到其中一个节点
bool falg2=LCA(root->right,node1,node2,restult,root);
if (falg1&&falg2)
{
//左右子树各找到一个节点,则当前节点为两节点的最近共同祖先。
restult=root;
return true;
}
//D查看当前节点是否为其中一个节点
if (root->data==node1->data||root->data==node2->data)
{
if (falg1||falg2)
{
//在左子树或右子树上已找到一个节点,当前节点为两节点中的另一个节点,当前子树的父节点为两节点的最近共同祖先。
restult=parent;
}
//else: 代表当前节点的父节点的某一子树上找到了一个节点
return true;
}
return falg1||falg2;
}
void LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult)
{
LCA(root,node1,node2,restult,NULL);
}