剑指 Offer 68 - I. 二叉搜索树的最近公共祖先java题解

日记:靓仔800及格了

1.迭代法

1.1 分析

root为最近公共祖先,有三种情况:
1.p,q分别在root的左右子树中
2.p=root,且 q在 root的左或右子树中;
3.q = root,且 p 在 root 的左或右子树中;

思路:
1.如果p,q都在左子树中(p.val 2.如果p,q都在右子树中(p.val>root.val&&q.val>root.val),迭代至root.right;
3.其他情况,root就是要找的最近公共祖先。

1.2 代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
     
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
     
        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{
     
                break;
            }
        }
        return root;
    }
}

1.3 复杂度

时间复杂度O(N):树的最小层数是lgn,最差情况退化成链表是O(N)
空间复杂度O(1)

1.4 结果

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先java题解_第1张图片

2.递归法

2.1 分析

1.如果p,q都在左子树中(p.val 2.如果p,q都在右子树中(p.val>root.val&&q.val>root.val),开启递归root.right;
3.返回root

2.2 代码

class Solution {
     
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
     
        if(root==null)
            return null;
        if(p.val<root.val&&q.val<root.val)
            return lowestCommonAncestor(root.left,p,q);
        else if(p.val>root.val&&q.val>root.val)
             return lowestCommonAncestor(root.right,p,q);
        else
            return root;
    }
}

2.3 复杂度

时间复杂度O(N):树的最小层数是lgn,最差情况退化成链表是O(N)
空间复杂度O(N):最差情况下,当树退化成链表时,递归深度达到树的层数N。

2.4 结果

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先java题解_第2张图片

你可能感兴趣的:(剑指Offer,1024程序员节,二叉树,数据结构,leetcode,java)