【问题标题】:Binary Tree Level Order Traversal using Javascript使用 Javascript 的二叉树级顺序遍历
【发布时间】:2020-10-28 06:57:24
【问题描述】:

这是一个 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,null,null,15,7],

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

LeetCode 问题链接: BinaryTreeTraversalUsingBFS

【问题讨论】:

标签: javascript multidimensional-array binary-tree breadth-first-search


【解决方案1】:

您可以在@Ahmad Atrach 的代码中尝试这种位修改

const dfs = (node,result,level) => {

if(!node) return;
if(!result[level]){
    result.push([]);
}
result[level].push(node.val);
dfs(node.left,result, level+1);
dfs(node.right,result, level+1);
}
var levelOrder = function(root) {

  if(!root) return [];
  let result = [];
  dfs(root,result,0);

  return result;
};

【讨论】:

    【解决方案2】:

    这是它的递归解决方案

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

    【讨论】:

      【解决方案3】:

      根据你的代码库,我修改它以供工作。

      • 添加索引以增加输出索引。
      • 使用严格相等运算符而不是赋值变量。
      • 删除output = output + '/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;
      };

      【讨论】:

        【解决方案4】:

        我想你快到了。不过不确定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
        }
        

        参考文献

        • 有关其他详细信息,您可以查看Discussion Board。有很多公认的解决方案,有各种languages 和解释、高效的算法,以及渐近的time/space 复杂性分析1, 2

        【讨论】:

        • 那是一个很好的解决方案,您可以击中靶心。我是 Javascript 新手,所以基本上你有级别数组,并且每次子节点完成时,你都会将此数组推送到父数组级别。新行在这里对数组无关紧要,它只是为了显示,但我想如果我们需要将它显示为字符串,那么必须输入新行。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多