(1)如果这棵树是二叉搜索树
二叉搜索树是排序过的,位于左子树的节点的值比当前节点的值小,而位于右子树的节点的值都比当前节点的值大。我们只需要从树的根节点开始和两个输入的节点进行比较。
(1)如果当前节点的值比两个节点的值都大,那么最近公共祖先一定在当前节点的左子树里。于是下一步遍历当前节点的左子树的节点。
(2)如果当前节点的值比两个节点的值都小,那么最近公共祖先一定在当前节点的右子树里,于是下一步遍历当前节点的右子树的节点。
(3)从根节点开始从上到下,第一个当前节点的值在两个节点值的中间,那么这个节点就是两个节点的最近公共祖先。
Node* BSTNearCommAncestor(Node* left, Node* right)
{
if (_root == NULL)
{
return NULL;
}
Node* cur = _root;
while (cur)
{
if (cur->_data > left->_data && cur->_data > right->_data)
{
cur = cur->_left;
}
else if (cur->_data < left->_data && cur->_data < right->_data)
{
cur = cur->_right;
}
else
{
break;
}
}
if (cur)
{