题解 | #二叉搜索树的最近公共祖先#
二叉搜索树的最近公共祖先
https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param p int整型
* @param q int整型
* @return int整型
*/
int fun(TreeNode *r,int n1,int n2)
{
if(r->val>=n1 && r->val<=n2)
return r->val;
if(r->val>=n2) //祖先在左侧
return fun(r->left,n1,n2);
else //祖先在右侧
return fun(r->right,n1,n2);
}
int lowestCommonAncestor(TreeNode* root, int p, int q) {
// write code here
if(p>q)
{
int temp = p;
p=q;
q=temp;
}
return fun(root,p,q);
}
};
第一步先将p和q按小大顺序交换位置
然后进入递归判断
根据排序二叉树的性质,小值在左子树,大值在右子树
我们可以明确找到结束递归的条件就是当
root->val >= p && root->val<= q,此时root就是最近祖先
为什么呢?经过简单的逻辑分析可以知道,某个节点能将p和q两个节点区分在左右子树上,这个节点就是最近的祖先
而后我们交给下级任务,直至完成。
因为测试条件的特殊性,我们不需要考虑越界问题。

