难度中等
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点2
和节点8
的最近公共祖先是6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点2
和节点4
的最近公共祖先是2
, 因为根据定义最近公共祖先节点可以为节点本身。
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉搜索树中。
思路
二叉搜索树又有新玩法了.这个二叉搜索树的最近公共祖先不是利用二叉搜索树的有序性这个特性了.而是利用二叉搜索树的左子树都比根节点小,右子树都比根节点大.
-
如果当前节点>p并且>q的值,那说明最近公共祖先在左子树上(返回左子树的最近公共祖先)
-
如果当前节点<p并且<q的值,那说明最近公共祖先在右子树上(返回右子树的最近公共祖先)
-
否则的话p在左,q在右或者p在右,q在左 根节点为最近公共祖先
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return null;
//如果当前节点>p并且>q的值,那说明最近公共祖先在左子树上(返回左子树的最近公共祖先)
if(root.val>p.val&&root.val>q.val) {
return lowestCommonAncestor(root.left,p,q);
}
//如果当前节点<p并且<q的值,那说明最近公共祖先在右子树上(返回右子树的最近公共祖先)
if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right,p,q);
}
//否则的话p在左,q在右或者p在右,q在左 根节点为最近公共祖先
return root;
}
}
所以现在总结了两个结论:
对于二叉搜索树来说主要利用其两个特性进行解题
- 1.利用二叉搜索树的中序遍历有序性,一般都需要一个前驱指针,因为要与当前节点进行比较,或者作差,反正就是前驱结点与当前节点的关系.
- 2.利用二叉搜索树的左子树都比根节点小,右子树都比根节点大的特性,这个还需总结,看后几题有没有用到.