给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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。
解题思路:抓住搜索二叉树的特点:左子树 < root < 右子树
即,如果pq都小于root,说明answer在左子树;反之pq都大于root,说明在右子树。
1)递归实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null)
return root;
if(q.val < root.val && p.val < root.val){//如果qp都小于root,对root的左子树进行递归
return lowestCommonAncestor(root.left,p,q);
}
if(q.val >root.val && p.val > root.val){//如果pq都大于root,对root的右子树进行递归
return lowestCommonAncestor(root.right,p,q);
}
return root;
}
}
2)迭代实现
在判断之后,通过变换当前节点来进行迭代
扫描二维码关注公众号,回复:
5905447 查看本文章
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return root;
}
while(root != null){
if(p.val < root.val && q.val < root.val){
root = root.left;//变换当前节点,向下遍历
}else if(p.val > root.val && q.val >root.val){
root = root.right;
}else{
return root;
}
}
return root;
}
}