1. 程式人生 > >[leetcode] 102. 二叉樹的層次遍歷

[leetcode] 102. 二叉樹的層次遍歷

102. 二叉樹的層次遍歷

二叉樹的層次遍歷很簡單,用佇列實現bfs即可。
這裡難點是要區分出每一層的樓層,分別放到對應的數組裡

實際上在bfs的時候判斷好在什麼時候就進入了下一層即可。

設定一個標記位,用來標記當前元素是本層的最後一個元素。顯然,第一層的root只有一個元素,為第一個標記。
仔細觀察可以發現,下一層的最後一個元素為當前佇列中最後一個元素,把標記更新即可。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if (root == null) return list;
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        TreeNode flag = root;
        List<Integer> nowNumList = new ArrayList<>();
        list.add(nowNumList);

        while (!queue.isEmpty()) {
            TreeNode nowNode = queue.poll();
            nowNumList.add(nowNode.val);

            TreeNode sonNode = nowNode.left;
            if (sonNode != null) queue.offer(sonNode);

            sonNode = nowNode.right;
            if (sonNode != null) queue.offer(sonNode);

            if (flag == nowNode && !queue.isEmpty()) {//判斷當前元素是否為本層最後一個節點。注意要判斷當處於最後一層的時候不執行,否則會新增一個空的list
                nowNumList = new ArrayList<>();
                list.add(nowNumList);
                flag = queue.peekLast();//更新標記
            }
        }
        return list;
    }
}

相比普通dfs,僅僅多出幾行程式碼:

TreeNode flag = root;
List<Integer> nowNumList = new ArrayList<>();

...

if (flag == nowNode && !queue.isEmpty()) {
    nowNumList = new ArrayList<>();
    list.add(nowNumList);
    flag = queue.peekLast();
}