中级农民
- 积分
- 117
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-5-19
- 最后登录
- 1970-1-1
|
贴个自己的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;
} |
|