Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL
看到这题首先想的是用dfs,和I一样,后来发现总是有test case通不过,开始考虑是不是bfs更好,于是转用queue实现level order traversal,同时两个变量cur和next来记录当前level的节点数和下一个level的节点数,另外,每次访问完一个节点,把它保存在变量node中,当下次访问它的邻居时,就可以用node.next指向邻居了。
public void connect(TreeLinkNode root) {
if(root==null)
return;
Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
queue.add(root);
int cur = 1, next =0;
TreeLinkNode node = null;
while(!queue.isEmpty()){
root = queue.remove();
if(root.left!=null){
queue.add(root.left);
next++;
}
if(root.right!=null){
queue.add(root.right);
next++;
}
cur--;
if(node!=null)
node.next=root;
node=root;
if(cur==0){
cur = next;
next=0;
node=null;
}
}
}