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
public void connect(TreeLinkNode root) {
if (root == null) return;
// now find root.next's valid child
TreeLinkNode n = root.next, nextNodeChild = null;
while (n != null && nextNodeChild == null) {
if (n.left != null) {
nextNodeChild = n.left;
break;
}
if (n.right != null) {
nextNodeChild = n.right;
break;
}
n = n.next;
}
// now nextNodeChild is fetched
if (root.right != null)
root.right.next = nextNodeChild;
if (root.left != null)
root.left.next = root.right == null ? nextNodeChild : root.right;
// recursion call
connect(root.right);
connect(root.left);
}
http://www.shuati123.com/blog/2014/05/27/Populating-Next-Right-Pointers-in-Each-Node-II/
方法二
public void connect(TreeLinkNode root) {
while (root != null) {
TreeLinkNode tempChild = new TreeLinkNode(0);
TreeLinkNode currentChild = tempChild;
while (root != null) {
if (root.left != null) {
currentChild.next = root.left;
currentChild = currentChild.next;
}
if (root.right != null) {
currentChild.next = root.right;
currentChild = currentChild.next;
}
root = root.next;
}
root = tempChild.next;
}
}
https://github.com/int32bit/leetcode/tree/master/algorithms/PopulatingNextRightPointersinEachNodeII