Binary Tree Level Order Traversal LeetCode二叉树层序遍历 JavaScript解法

原题链接在此:https://leetcode.com/problems/binary-tree-level-order-traversal/

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).

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点,同层节点就放在同一个数组里面)。

比如:

Binary Tree Level Order Traversal  LeetCode二叉树层序遍历 JavaScript解法

 

 

 

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)
        }
    }
    
}

 

上一篇:CSS基础 列表相关的属性的使用


下一篇:数据结构作业