1. 程式人生 > 其它 >Binary Tree Level Order Traversal LeetCode二叉樹層序遍歷 JavaScript解法

Binary Tree Level Order Traversal LeetCode二叉樹層序遍歷 JavaScript解法

原題連結在此:https://leetcode.com/problems/binary-tree-level-order-traversal/

Given therootof a binary tree, returnthe level order traversal of its nodes' values. (i.e., from left to right, level by level).

給你一個二叉樹,請你返回其按層序遍歷得到的節點值。 (即逐層地,從左到右訪問所有節點,同層節點就放在同一個數組裡面)。

比如:

Input: root = [3,9,20,null,null,15,7]
Output: [[3],[9,20],[6,15,7]]

非常經典的一道題,一般會使用BFS(廣度優先) 和 DFS(深度優先) 兩種演算法來解答

使用BFS,需要一個queue的輔助

首先把root放入queue中( queue = [ 3 ] ),

利用queue的先進先出的特點,判斷如果queue不為空,則儲存queue的length,迴圈遍歷直到length為0。迴圈過程中需要做兩件事,第一件事是把節點從queue的頭中取出來,放入一個數組裡,這個陣列就是我們返回結果中的內層巢狀陣列,並且把節點的左右子節點又放入queue中,便於接下來的遍歷。

第一次迴圈過後,我們得到 ret =[ [3] ], queue = [ 9, 20 ],此時queue不為空,繼續重複上一步

第二次迴圈後,我們得到 ret =[ [ 3 ], [ 9, 20 ] ], queue = [ 6, 15, 7 ]

第三次迴圈過後,我們就得到了ret =[ [ 3 ], [ 9, 20 ] ,[ 6, 15, 7 ] ],此時queue為空,把ret結果return出去

var levelOrder = function(root) {
    let ret = [];
    let queue = [];
    queue.push(root); //把root放入queue中
    leverOrderFunc();
    return ret;
    
    function
leverOrderFunc(){ while(queue.length){ let top, queLen = queue.length; let innerLevel = []; while(queLen--){ // 迴圈當前層的node let top = queue.shift(); if(top && top.val !== undefined){ innerLevel.push(top.val); if(top.left !== null){ queue.push(top.left); } if(top.right != null){ queue.push(top.right); } } } if(innerLevel.length){ ret.push(innerLevel) } } } };

使用DFS時,由於當前節點所在level是不變的,深度遍歷時,只需要知道當前level,就能把元素放入當前level對應的陣列中(每向下一層遍歷,level + 1),還用到遞迴(BFS解法中,也可以把判斷queue是否為空,改為如果queue不為空就呼叫遞迴迴圈)

var levelOrder = function(root) {
    let ret = [];
    traversal(root, ret, 0);
    return ret;
    
    function traversal(node, ret, level){
        if(node === null) return;
        if(ret.length-1 < level) ret.push([]);
        ret[level].push(node.val);
        if(node.left !== null){
            traversal(node.left,ret,level+1)
        }
         if(node.right !== null){
            traversal(node.right,ret,level+1)
        }
    }
    
}