problem
LeetCode 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
solution
思路过程
- 先做了68-II,觉得这个题相对而言确实简单了
- 上句话我收回,突然想到没这么简单呀,我再想想
- 利用搜索树的性质,先用 p 和 q 与 root 的值进行大小比较
- 如果 q 和 p 中的值其中一个小于等于 root 的值而另外一个大于等于 root 的值,就直接返回 root;
- 如果 q 和 p 同时大于或者小于,向下找,
- 遇到叶子结点就终止,可以尝试着用迭代的方式
- 但是通解还是68-II,牛逼
- 核心就是公共结点一定是处于这两个值之间,加入 p.val<q.val,那么公共结点的值x 一定满足 p.val<=x<=q.val,遍历每一个结点,然后找到满足这种关系的结点就可以了
代码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
Stack<TreeNode> stack=new Stack<>();
while(!stack.isEmpty() || root!=null){
while(root != null){
if((root.val>=p.val && root.val<=q.val) || (root.val<=p.val &&root.val>=q.val)){
return root;
}
stack.push(root);
root=root.left;
}
root=stack.pop();
root=root.right;
}
return null;
}
}
优化
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int bigger,smaller;
if(p.val>q.val){
bigger=p.val;
smaller=q.val;
}else{
bigger=q.val;
smaller=p.val;
}
Stack<TreeNode> stack=new Stack<>();
while(!stack.isEmpty() || root!=null){
while(root != null){
if(smaller<=root.val && bigger>=root.val){
return root;
}
stack.push(root);
root=root.left;
}
root=stack.pop();
root=root.right;
}
return null;
}
}