二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
题目思路:
若root是p,q的最近公共祖先,则只能是以下情况:
- p和q在root 的子树中,且为root的异侧。(即分别在左右子树中)。
- p=root,且q在root的左子树或者右子树中。
- q=root,且p在root的左子树或者右子树中。
那么本题说的是:1. 树为二叉搜索树。2.树中所有节点都是唯一的。根据这个关系,可以方便判断root与p,q关系:
- 若
root.val < p.val,则p在root右子树中。 - 若
root.val>p.val,则p在root左子树中。 - 若
root.val=p.val,则p和root指向同一节点。
方法一:迭代
- 循环搜索:当root为空退出:
- 当p、q都在root右子树中,则遍历
root.right。 - 否则当p、q都在root左子树中,则遍历
root.left. - 否则说明找到了公共祖先,跳出。
- 当p、q都在root右子树中,则遍历
- 返回值:最近公共祖先root。
代码实现:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val < p.val && root.val < q.val) root =root.right;
else if(root.val > p.val && root.val > q.val) root = root.left;
else break;
}
return root;
}
}
方法二:递归
- 流程:
- 当p,q都在root的右子树中,则开起root.right并返回。
- 否则,当p,q都在root的左子树中,则开起递归root.left并开起。
- 返回值:最近公共祖先root
代码实现:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val <p.val && root.val < q.val){
return lowestCommonAncestor(root.right,p,q);
}
if(root.val > q.val && root.val> p.val){
return lowestCommonAncestor(root.left,p,q);
}
return root;
}
}

浙公网安备 33010602011771号