117. Populating Next Right Pointers in Each Node II

https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/#/description

在做116题的时候我就感觉那解法虽然短但是有点tricky了,都没有用到一个链表来存储每一行的list。
这题就发现上一题的解法不好适用了。于是老老实实去学了一下标准套路。
我发现这种题的套路还是要静下心来看,在图上好好画一步步学。不知道真正面对一道陌生的树的题目时我什么时候能想出答案来。

下面的代码参考了leetcode solution里的代码。code ganker那个也是类似的layer order traverse的思想,但是他代码维护了4个node,有点复杂。

    //based on level order traversal
    public void connect(TreeLinkNode root) {

        TreeLinkNode cur = root;
        TreeLinkNode pre = null; //下一level的dummyNode
        TreeLinkNode head = null; //下一level的head node

        while (cur != null) {
            //外层while用于移动到下一level,内层while用于同一层level order traverse
            while (cur != null) {
                if (cur.left != null) {
                    if (pre != null) {
                        pre.next = cur.left;
                    } else {
                        head = cur.left;
                    }
                    //无论pre是否
                    pre = cur.left;
                }

                if (cur.right != null) {
                    if (pre != null) {
                        pre.next = cur.right;
                    } else {
                        head = cur.right;
                    }
                    pre = cur.right;
                }
                //想象一个perfect binary tree,在pre到达第3层的时候,cur是第二层,cur的next已经被之前的pre链接起来了
                cur = cur.next;
            }

            //move to next level
            cur = head;
            pre = null;
            head = null;
        }
    }
117. Populating Next Right Pointers in Each Node II_第1张图片
draft

看看自己的草稿觉得好像挺高深的。。Zhengyu说我走火入魔了。。在公司待了两天半。。下午去博物馆散散心了。

你可能感兴趣的:(117. Populating Next Right Pointers in Each Node II)