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