LeetCode 236: Lowest Common Ancestor of a Binary Tree

/**
 * 236. Lowest Common Ancestor of a Binary Tree
 * 1. Time:O(n)  Space:O(h)
 * 2. Time:O(n)  Space:O(n)
 */

// 1. Time:O(n)  Space:O(h)
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null || root==p || root==q) return root;
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left!=null && right!=null) return root;
        else return left==null? right:left;
    }
}

// 2. Time:O(n)  Space:O(n)
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        Stack<TreeNode> stack = new Stack<>();
        HashMap<TreeNode,TreeNode> map = new HashMap<>();
        stack.push(root);
        map.put(root,null);
        while(!map.containsKey(p) || !map.containsKey(q)){
            TreeNode cur = stack.pop();
            if(cur.left!=null){
                stack.push(cur.left);
                map.put(cur.left,cur);
            }
            if(cur.right!=null){
                stack.push(cur.right);
                map.put(cur.right,cur);
            }
        }
        HashSet<TreeNode> set = new HashSet<>();
        while(p!=null){
            set.add(p);
            p = map.get(p);
        }
        while(q!=null){
            if(set.contains(q))
                break;
            q = map.get(q);
        }
        return q;
    }
}
原文地址:https://www.cnblogs.com/AAAmsl/p/12855343.html