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

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

    比如:

    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)
            }
        }
        
    }
  • 相关阅读:
    面向对象的设计原则
    在VC中Debug下是运行结果正确的,但是在Release下却有错,总算找到原因
    聚合和组合
    痛苦呀,代码
    MSDN和VS98
    阅读代码的难度
    好香,方便面
    人的重要性
    FIT For .NET(1)
    ASP.NET Microsoft .NET Pet Shop 3.x(二)
  • 原文地址:https://www.cnblogs.com/daisygogogo/p/15701272.html
Copyright © 2020-2023  润新知