先解释一下这道题的意思,就是给定一棵二叉树,然后这棵树上有两个结点,请找出他们两个的最近公共祖先,也就是它们两个距离最近的公共结点,例如:
上面这棵树中D和F的最近公共祖先就是A,D和E的最近公共祖先就是B。
那么我们会发现如果这两个结点分别在root的左右两颗子树上,那么它们两个的最近公共祖先一定是根节点。代码如下:
BNode *GetNearestAncestor(BNode *root, BNode *n1, BNode *n2)
{
BNode *n1InLeft = Search(root->left, n1->data);
BNode *n2InLeft = Search(root->left, n2->data);
if (!n1InLeft&&n2InLeft)
{
return root;
}
if (n1InLeft && !n2InLeft)
{
return root;
}
if (n1InLeft)
{
return GetNearestAncestor(root->left, n1, n2);
}
else {
return GetNearestAncestor(root->right, n1, n2);
}
}