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;
}
}
看看自己的草稿觉得好像挺高深的。。Zhengyu说我走火入魔了。。在公司待了两天半。。下午去博物馆散散心了。