【问题标题】:javascript: pushing binary tree values into an array using the recursion methodjavascript:使用递归方法将二叉树值推入数组
【发布时间】:2021-09-04 05:57:09
【问题描述】:

我正在尝试使用按顺序遍历和递归方法遍历二叉搜索树。我的目标是将每个节点的值推入一个数组并返回它。这是我的代码:

  dfsInOrder(node=this.root) {
    let nodes = []
    if(node === null) return 


    nodes.push(this.dfsInOrder(node.left))
    nodes.push(node.val)
    nodes.push(this.dfsInOrder(node.right))
    return nodes
  }

这是我将数据插入树的方式:

binarySearchTree
  .insert(15)
  .insert(20)
  .insert(10)
  .insert(12);

为了澄清,树的根值是 15,而 10 和 12 都在树的左侧。 20 在右边。

我正在寻找这样的结果:

[12,10,15,20]

但是我得到了这个:

[Array(3), 15, Array(3)].....


[undefined, 10, Array(3)]
15
[undefined, 20, undefined]

我的代码哪里出错了?

【问题讨论】:

    标签: javascript binary-search-tree inorder


    【解决方案1】:

    这是解决此问题的一种方法:

    dfsInOrder(node=this.root) {
      const nodes = [];
    
      if (node !== null) {
        nodes.push(
          ...this.dfsInOrder(node.left),
          node.val,
          ...this.dfsInOrder(node.right)
        );
      }
    
      return nodes;
    }
    

    在这段代码中,dfsInOrder...

    • 总是返回一个平面数组,边为空。从类型检查的角度来看,这稍微好一些,但也允许过滤掉您现在看到的这些 undefined
    • 将递归调用的结果(通过... 运算符)插入到结果数组时,总是将它们展平

    作为旁注,push 不会更改您的数组引用,因此此处无需使用let。实际上,可以重写这个函数来完全避免中间变量:

    dfsInOrder(node=this.root) {
      if (node === null) return [];
    
      return [
        ...this.dfsInOrder(node.left),
        node.val,
        ...this.dfsInOrder(node.right),
      ];
    }
    

    ...这对我来说很好,但调试起来有点困难。

    【讨论】:

    • 由于某种原因,当我使用扩展运算符时,我收到一条错误消息 this.dfsInOrder is not an iterable
    • 你确定你没有留下那些空的return声明吗?
    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多