查找最近公共祖先
查找的前提是,结点a和结点b都在树中。
主要操作对象是二叉查找树,具体步骤如下:
- 记当前根结点为x;
- 如果 a < x 且 b > x (或反过来),则说明x即为要求的祖先;
- 如果a,b都小于(大于)x,说明也要继续向左(右)子树查找;
- 如果 x == a(b),说明a(b)就是b(a)的祖先。
/* 查找公共祖先 */
int findAncestor(node* root, int a, int b)
{
// a,b结点在根结点左右两侧,说明该根结点就是公共祖先
if (a < root->data && b > root->data || a > root->data && b < root->data)
return root->data;
// a(b)即是b(a)的祖先
if (root->data == a || root->data == b)
return root->data;
// 继续向左右子树查找
if (a < root->data && b < root->data)
return findRoot(root->lchild, a, b);
else if (a > root->data && b > root->data)
return findRoot(root->rchild, a, b);
}