/**
* 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;
}
}