leetcode 235. 二叉搜索树的最近公共祖先
程序员文章站
2022-07-14 14:38:16
...
二叉搜索树,是常见的树形结构,其搜索效率比较高。
如果对二叉搜索树不熟悉,可以看之前的博客:二叉搜索树
下面看一道二叉搜索树的算法题目,leetcode地址
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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 为不同节点且均存在于给定的二叉搜索树中。
根据二叉搜索树的特性,比父节点小的存在于该节点的左子树,大的都存在于右子树。
那么,假设所寻找的最近公共节点记做A, 从开始根节点遍历,当前节点的值,与p、q的值比较,只可能存在三种结果,
- 当前节点值比两个都要大,A存在于当前节点的左子树
- 当前节点值比两个都要小,A存在于当前节点的右子树
- 其它情况,当前节点就是A(这句不理解,拿张纸,写写画画就明白了)
逻辑清楚之后,那代码就比较好写了
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode result = root;
if(null == result) return root;
int pVal = p.val;
int qVal = q.val;
while(true){
if(result.val > pVal && result.val > qVal){
result = result.left;
}else if(result.val < pVal && result.val < qVal){
result = result.right;
}else{
return result;
}
}
}