二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
![](https://img2022.cnblogs.com/blog/1542838/202209/1542838-20220915095547451-1087182348.png)
思路:利用二插搜索树的性质,来解决此题,
如果root节点的值大于p和q结点值,那么说明两个结点在root结点的左侧
如果root节点的值小于p和q结点值,那么说明两个结点在root结点的右侧
如果root节点的值大于p结点的值且小于q结点的值,那么p、q公共祖先就是root结点
代码如下:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
// p.val < root.val < q.val return root
if (root.val >= p.val && root.val <= q.val) {
return root;
}
// p.val和q.val都小于root.val 表明在左树
if (root.val > q.val && root.val > p.val) {
return lowestCommonAncestor(root.left, p, q);
} else if(root.val < q.val && root.val < p.val) {
// p.val和q.val都大于root.val 表明在右树
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
以上代码可以直接写成如下代码:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
//如果小于等于0,说明p和q位于root的两侧,直接返回即可
// 强转long类型原因:如果等式乘积为负,且乘数和被乘数数值过大,那么就会超过int的范围,就会变成正值
if ((long)(root.val - p.val) * (root.val - q.val) <= 0)
return root;
//否则,p和q位于root的同一侧,就继续往下找
return lowestCommonAncestor(p.val < root.val ? root.left : root.right, p, q);
}