LCA问题
给一个 二叉树 , 求最深节点的最小公共父节点。
//贴个自己的code.用的是level traversal,找出最深层的head和tail节点,用一个map来track 节点到父节点的映射。
//如果head 和tail相等,说明最深层就一个节点,如果不等,分别从map里向parent节点搜索,知道发现一个//公共的节点即为LCA。
public int lcaBFS(TreeNode root) {
if(root == null) return -1;
// <node -> parent node>
Map<TreeNode, TreeNode> map = new HashMap<TreeNode, TreeNode>();
TreeNode head = null, tail = null; // the head and tail node in a level
Queue<TreeNode> que = new LinkedList<TreeNode>();
que.offer(root);
map.put(root, null);
while(!que.isEmpty()) {
head = null; tail = null;
int sz = que.size();
while(sz-- > 0) {
TreeNode curr = que.poll();
if(head == null) head = curr;
if(sz == 0) tail = curr;
if(curr.left != null) {
map.put(curr.left, curr);
que.offer(curr.left);
}
if(curr.right != null) {
map.put(curr.right, curr);
que.offer(curr.right);
}
}
}
while(head != tail){
head = map.get(head);
tail = map.get(tail);
}
return head.val;
}