寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中)
对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以:
从根结点开始
- 若两个结点都在左子树 进入根节点左儿子继续判断
- 若两个结点都在右子树 进入根结点右儿子继续判断
- 若一个在左子树 一个在右子树 则这个结点这两个结点的最近公共祖先
Node* FindNode(Node*root,Node*p)//在root为根的树中找p结点
{
if (root == NULL)
return NULL;
if (root == p)
return root;
if (FindNode(root->left, p))
return FindNode(root->left, p);
return FindNode(root->right, p);
}
Node* LowestCommonAncestor(Node*root, Node*p, Node*q)
{
if (root == p || root == q)
return root;
Node*left = FindNode(root->left, p);
Node*right = FindNode(root->left, q);
if (left&&right)//都在左侧
LowestCommonAncestor(root->left, p, q);
else if (!left&&!right)//都在右侧
LowestCommonAncestor(root->right, p, q);
else
return root;
}