找两个节点的最低公共父节点,也即找到一个节点,使其左、右子树分别包含所要找的两个节点。如下图:
___________3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4对于7、4,其公共父节点为2,对于7、6,其公共父节点为5。一种比较特殊的情况,其中一个待查找节点是另一个节点的父节点,如2、5,其则其公共父节点为5。
Node *LCA(Node *root, Node *node1, Node *node2)
{
Node *leftFlag=NULL; //左子树包含待查找节点标志位
Node *rightFlag=NULL; //右子树包含待查找节点标志位
if(NULL==root) //如果根节点为空,查找失败
return NULL;
if(node1==NULL || node2==NULL)
return NULL;
if(root==node1 || node2==root) //如果根节点为其中一个待查找节点,则该节点为公共父节点。
return root;
leftFlag = LCA(root->left, node1, node2); //查找左子树是否包含待查找节点
rightFlag = LCA(root->right, node1, node2); //查找右子树是否包含待查找节点
if(leftFlag && rightFlag) //如果左右子树均有待查找节点,则该节点即为公共父节点
return root;
else if(leftFlag) //若果只有左子树有待查找节点,则返回左子树中找到的公共父节点
return leftFlag;
//LCA(root->left, node1, node2);
else if(rightFlag) //若果只有右子树有待查找节点,则返回右子树中找到的公共父节点
return rightFlag;
//LCA(root->right, node1, node2);
else return NULL;
}