题目是,输入两个树结点,求它们的最低公共祖先
首先,要说明的是,这是一组题目,根据剑指Offer上所讲的,这道题可能会分好几种情况,因此,如果在面试时候遇到,我们需要和面试官沟通,而不是一上来就写代码。
1. 如果给定树是二叉搜索树
二叉搜索树(又叫二叉排序树),中序遍历是可以得到有序序列的,因此,我们可以利用这个性质来解题。
假设给定的两个树结点为4,1,根据图示,显然3为最低公共祖先;
假设给定的两个树结点为4,3,根据图示,显然3为最低公共祖先;
假设给定的两个树结点为2,1,根据图示,显然2为最低公共祖先;
假设给定的两个树结点为6,8,根据图示,显然7为最低公共祖先;
假设给定的两个树结点为8,1,根据图示,显然5为最低公共祖先;
因此我们发现,公共祖先的值都是在给定两个树结点的范围之内。
所以,我们可以由根结点遍历,如果当前结点的值比两结点大,需要到当前结点的左子树中找,如果当前结点的值比两结点小,需要到当前结点的右子树中找,仅当当前结点的值在两结点的范围内(等于也算)。
代码比较简单,如下:
Node* FindLowestCommonAncestor(Node* root, Node* n1, Node* n2)
{
//参数有一个为空返回NULL
if (root == NULL || n1 == NULL || n2 == NULL)
return NULL;
if (root->data > n1->data && root->data > n2->data)
return FindLowestCommonAncestor(root->left, n1, n2);
else if (root->data < n1-><