1. 程式人生 > 實用技巧 >LeetCode 樹 116. 填充每個節點的下一個右側節點指標(層序遍歷 分層)

LeetCode 樹 116. 填充每個節點的下一個右側節點指標(層序遍歷 分層)

題目的要求,大白話說就是:把指標指向同層的右側節點

提到同層,自然就要想到層序遍歷,自然是佇列實現

問題是需要分層

所以採用之前題目用的那種計數的方式

class Solution {
    public Node connect(Node root) {
        if(root==null)
        {return root;}
        
        Queue<Node> queue=new ArrayDeque<>();
        Node fake=root;
        queue.add(root);
        
while(queue.size()!=0) { int count=queue.size(); for(int n=0;n<count;n++) { fake=queue.poll(); if(n<count-1) { fake.next=queue.peek(); } if(fake.left!=null
) { queue.add(fake.left); } if(fake.right!=null) { queue.add(fake.right); } } } return root; } }

幾個碰到的問題:

1.前面要加對於空樹的判斷,要不會搞出null.next這種錯誤

2.迴圈跳出的條件

是什麼?是queue.size()!=0,即所有元素已經進了佇列並且彈出了。我一開始寫成了fake!=null這個條件。仔細走一下這個順序,發現fake會一直都是最後一個節點,跑成了死迴圈。但其實加個判斷也能解決,但其實判斷的條件就是佇列排空。

3.這個地方

if(n<count-1)
                {
                    fake.next=queue.peek();
                }

首先是,好在有一個peek的方法,使我們不用搞front Node和back Node來把先後排出佇列的節點連起來

其次是為什麼要加if(n<count-1)這個計數的條件。因為最後一個元素的peek會peek到下一層去。。。

由此發現,這種迴圈中,判斷迴圈條件是什麼任然是一個很棘手的問題。