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:
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
对117题,要跳过空节点。 30%
/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        TreeLinkNode prevLevelStart = root, prev, cur;
        while (prevLevelStart != null) {
            prev = prevLevelStart;
            if (prev.left != null) {
                cur = prev.left;
            } else {
                cur = prev.right;
                prev = updatePrev(prev);
            }
            while (prev != null) {
                if (cur == prev.left) {
                    if (prev.right != null) {
                        cur.next = prev.right;
                        cur = cur.next;
                    }
                    prev = updatePrev(prev);   
                } else {
                    if (prev.left != null) {
                        cur.next = prev.left;
                        cur = cur.next;
                    } else {
                        cur.next = prev.right;
                        cur = cur.next;
                        prev = updatePrev(prev);
                    }
                }
            }
            prevLevelStart = updatePrevLevelStart(prevLevelStart);
        }
    }
    public TreeLinkNode updatePrev(TreeLinkNode prev) {
        prev = prev.next;
        while (prev != null && prev.left == null && prev.right == null) {
            prev = prev.next;
        }
        return prev;
    }
    public TreeLinkNode updatePrevLevelStart(TreeLinkNode prevLevelStart) {
        while (prevLevelStart != null) {
            if (prevLevelStart.left != null && (prevLevelStart.left.left != null || prevLevelStart.left.right != null)) {
                return prevLevelStart.left;
            } else if (prevLevelStart.right != null && (prevLevelStart.right.left != null || prevLevelStart.right.right != null)) {
                return prevLevelStart.right;
            } else {
                prevLevelStart = prevLevelStart.next;
            }
        }
        return null;
    }
}
117. Populating Next Right Pointers in Each Node II
原文:http://www.cnblogs.com/yuchenkit/p/7192625.html