当前位置: 首页 > 知识库问答 >
问题:

使用Javascript实现二叉树级顺序遍历

空成天
2023-03-14

这是一个leetcode问题。

给定一个二叉树,返回其节点值的级序遍历(即从左到右,逐级)。

例如:给定二叉树[3,9,20, null, null,15,7]

    3
   / \
  9  20
    /  \
   15   7

将其级别顺序遍历返回为:

[
  [3],
  [9,20],
  [15,7]
]

但我正在用JavaScript尝试一种新的方式,而不是完全按照他们的解决方案。到目前为止,我能够打印阵列,但

如何在新行中打印不同的级别

以下是我目前的代码

var levelOrder = function(root) {
let output = [];
let queue = [];
let currentNode = root;
queue.push(currentNode);
let currentLevel = 1;
while(queue.length){
    
    currentNode = queue.shift();
    currentLevel--; //this will ensure we are adding new lines only on next level
    output.push(currentNode);
    
    if(currentNode.left){
        queue.push(currentNode.left);
    }
    if(currentNode.right){
        queue.push(currentNode.right);
    }
    
    if(currentLevel = 0){
        output = output + '/n'; //Insert a new line
        currentLevel = queue.length; //2
    }
}
return output;
};

输入:[3,9,20,空,空,15,7],

Expected Output:
[
[3],
[9,20],
[15,7]
]

LeetCode问题链接:BinarytreeTraversingBFS

共有3个答案

杨良才
2023-03-14

这是它的递归解决方案

    var levelOrder = function(root) {
    let result =[];
    if(!root)return result;
    if(!root.left && !root.right){
        result.push([root.val]);
        return result;
    }
    const pushIntoResult =(node, level) =>{
        if(!node) return;
        if(!result[level]){
            result.push([]);
        }
        result[level].push(node.val);
        pushIntoResult(node.left, level+1);
        pushIntoResult(node.right, level+1);
    }
    pushIntoResult(root, 0);
    return result;
};
归鸿朗
2023-03-14
匿名用户

基于您的代码库,我修改它以供工作。

  • 添加用于增加输出索引的索引。
  • 使用严格的等号操作符代替赋值变量。
  • 删除输出=输出'/n',因为输出是一个数组。
var levelOrder = function (root) {
  let output = [];
  let queue = [];
  let currentNode = root;
  queue.push(currentNode);
  let currentLevel = 1;
  let index = 0; // Add an index for increasing the output index

  while (queue.length) {

    currentNode = queue.shift();
    currentLevel--;

    if (!output[index]) { // Set default is an array for each output element in first time
      output[index] = [];
    }

    output[index].push(currentNode.val);

    if (currentNode.left) {
      queue.push(currentNode.left);
    }

    if (currentNode.right) {
      queue.push(currentNode.right);
    }

    if (currentLevel === 0) { // Use strict equality operator to compare 0
      index++; // increase index
      currentLevel = queue.length;
    }
  }

  return output;
};

凤高翰
2023-03-14

我想你快到了。不确定什么output=output'/n' 是用于。

这将通过:

var levelOrder = function(root) {
    const levels = []

    if(!root) {
        return levels
    }

    const queue = [root]
    while (queue.length){
       const queueLength = queue.length
       const level = []

       for(let i = 0; i < queueLength; i++){

           const node = queue.shift()

           if(node.left){
               queue.push(node.left)
           }
           if(node.right){
               queue.push(node.right)
           }

           level.push(node.val)
       }
       levels.push(level)
   }
    return levels
}
  • 有关更多详细信息,请参见讨论板。这里有许多公认的解决方案,包括各种语言和解释、高效算法以及渐近时间/空间复杂性分析1,2

 类似资料:
  • 我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需

  • 我正在尝试实现一个levelOrder函数,它接受树的指针并逐级打印树的数据。这是《C如何编程》一书中的一个问题,完整问题如下: (级序二叉树遍历)Fig的程序。12.19说明了遍历二叉树的三种递归方法——顺序遍历、前序遍历和后序遍历。此练习演示了二叉树的级别顺序遍历,其中节点值从根节点级别开始逐级打印。每个级别上的节点从左到右打印。级序遍历不是递归算法。它使用队列数据结构来控制节点的输出。算法如

  • 我正在尝试编写一个函数,该函数将使用级别顺序遍历将一个元素插入到二叉树中。我的代码遇到的问题是,当我在树中插入一个新节点后打印级别顺序遍历时,它以无限循环的方式打印元素。1,2,3,4,5,6,7,8这个数字一直在飞驰过终点站。我将感谢任何关于如何补救这种情况的指示和建议。 这是我通过修改级别顺序遍历技术将一个元素插入到树中的地方 主

  • 本文向大家介绍javascript实现二叉树遍历的代码,包括了javascript实现二叉树遍历的代码的使用技巧和注意事项,需要的朋友参考一下 前言: 紧接着上篇 二叉树的javascript实现 ,来说一下二叉树的遍历。 本次一本正经的胡说八道,以以下这个二叉树为例子进行遍历: 接着是要引入二叉树实现的代码: 二叉树遍历的分类 二叉树的遍历分为先序、中序、后序遍历。这里说到的先序、中序、后序是相

  • 我必须创建两个类:NonBinaryTree和SingleNode类,包含一些处理节点和整个树的方法(在NonBinaryTree类中)。我在使用队列(先进先出类型)实现非二叉树的BFS(层次顺序)遍历时遇到过问题。由于二叉树有很多资源,每个节点最多有两个子节点,我还没有找到任何可以帮助我解决非二叉树问题的资源。 到目前为止,我做了这个代码: 我的树: 在此处输入图像描述 我需要按以下顺序处理节点