Given the root of a binary tree, return the level order traversal of its nodes’ values. (i.e., from left to right, level by level).
給與二元樹的根,傳回其節點值的層序遍歷。 (即由左至右,逐級)。
Example 1:
Input: root = [3,9,20,null,null,15,7] Output: [[3],[9,20],[15,7]]
Example 2:
Input: root = [] Output: []
Example 3:
Input: root = [1] Output: [1]
solution:
1. 首先,我們要知道 level order traversal(層序遍歷)所指的方向,接著:
2. 我們在 Level Order Traversal(root) 的函式中接受 binary tree 的輸入,並透過 bfs 來完成前序遍歷的結果。
3. 我們先判斷 node 是否為 null,如果是則直接返回。
4. 在 bfs(node, result) 中開始做 node 的遍歷。
5. 使用一個 queue 來儲存要訪問的節點。這是 BFS 的基本操作。
6. 在每一次的循環中,我們只考慮當前 queue 中的節點,也就是當前層級的所有節點。
7. 對於當前層級的每個節點,我們先將其從 queue 中移除,然後將其子節點(如果有的話)加入到 queue 中。
8. 訪問完當前層級的所有節點後,我們再繼續下一層級的節點,直到 queue 變空。
ex. 層序遍歷步驟: 1. 訪問當前節點 2. 遍歷左子樹 3. 遍歷右子樹 4. 訪問下一節點 附上示意圖: https://ithelp.ithome.com.tw/articles/10289291
Code 1: BFS
class TreeNode {
  constructor(val, left = null, right = null) {
    this.val = val;
    this.left = left;
    this.right = right;
  }
}
var levelOrder = function(root) {
    // 1. 檢查 root 是否為空
    if (!root) return [];
    // 2. 創建一個陣列來存放結果
    const result = [];
    // 3. 把根節點放入 BFS 函數中
    bfs(root, result);
    return result;
};
function bfs(node, result) {
    // 初始化
    const queue = [];  // 創建一個隊列來存放節點
    queue.push(node);
    // 當隊列不為空時,繼續執行
    while (queue.length) {
        const len = queue.length;
        const row = [];
        // 對當前階層的每一個節點進行處理
        for (let i = 0; i < len; i++) {
            // 從隊列中取出一個節點
            const cur = queue.shift();
            // 如果這個節點有左子節點,則將其放入隊列中
            if (cur.left) queue.push(cur.left);
            // 如果這個節點有右子節點,則將其放入隊列中
            if (cur.right) queue.push(cur.right);
            // 將當前節點的值加入到 row 陣列中
            row.push(cur.val);
        }
        // 最後,將 row 陣列加入到 output 陣列中
        result.push(row);
    }
}
FlowChart:
Example 1
TreeNode {
  val: 3,
  left: TreeNode { val: 9, left: null, right: null },
  right: TreeNode {
    val: 20,
    left: TreeNode { val: 15, left: null, right: null },
    right: TreeNode { val: 7, left: null, right: null }
  }
}
TreeNode {
  val: 3,
  left: TreeNode { val: 9, left: null, right: null },
  right: TreeNode {
    val: 20,
    left: TreeNode { val: 15, left: null, right: null },
    right: TreeNode { val: 7, left: null, right: null }
  }
}
[ [ 3 ], [ 9, 20 ], [ 15, 7 ] ]
Example 2
const rootNode = []
Example 3
TreeNode { val: 1, left: null, right: null }