Binary Tree Level Order Traversal LeetCode二叉樹層序遍歷 JavaScript解法
原題連結在此:https://leetcode.com/problems/binary-tree-level-order-traversal/
Given theroot
of 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; functionleverOrderFunc(){ 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) } } }