题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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。
思路
- 明确二叉搜索树的特性:左<中<右
- 本题与 寻找二叉树的最近公共父节点 类似,甚至直接使用 寻找二叉树的最近公共父节点的代码都可以直接
AC,但二叉搜索树有着非常良好的特性,我们可以利用它的特性,这样便可以不用遍历所有节点了。 - 如何利用二叉搜索树的特性呢?
- 若p,q大于root,直接在root的右子树中去寻找。
- 若p,q小于root,直接在root的左子树中去寻找。
- 若p,q等于root,那root就是它们的最近公共父节点。
代码
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null {
if(root==null) return root;
//左
if(root.val>Math.max(p.val,q.val)){
return lowestCommonAncestor(root.left,p,q);
}
//右
if(root.val<Math.min(p.val,q.val)){
return lowestCommonAncestor(root.right,p,q);
}
if((p.val<root.val&&root.val<q.val)||(q.val<root.val&&root.val<p.val)||root.val==p.val||root.val==q.val){
return root;
}
};
总结
本题与二叉树最近公共祖先思路上是相同的,如有错误之处,欢迎大家留言指出。