Javascript 前序遍历迭代与递归时间复杂度

Javascript 前序遍历迭代与递归时间复杂度,javascript,data-structures,Javascript,Data Structures,我正在为我的web应用程序使用树。例如,创建一个profil站点,每个profil可以有0..n个好友。还有,我想在最好的时候找个朋友。为此,我使用了二叉搜索树和Breadh First Search(BFS) 我测量了两个函数在递归和迭代列表中搜索朋友的时间,我惊讶于递归函数更快。我认为iterativ函数比iterative函数更快,我在迭代函数中只使用了一次while循环,时间复杂度为O(n)。有人能解释一下这里的错误以及递归函数更快的原因吗: 时间递归:1.300000003539025

我正在为我的web应用程序使用树。例如,创建一个profil站点,每个profil可以有0..n个好友。还有,我想在最好的时候找个朋友。为此,我使用了二叉搜索树和Breadh First Search(BFS)

我测量了两个函数在递归和迭代列表中搜索朋友的时间,我惊讶于递归函数更快。我认为iterativ函数比iterative函数更快,我在迭代函数中只使用了一次while循环,时间复杂度为O(n)。有人能解释一下这里的错误以及递归函数更快的原因吗:

时间递归:1.3000000035390258

 preorderRec(root){
    if(root === null) {
      return;
    }
    console.log(root.data);
    if(root.left) {
      this.preorderRec(root.left);
    }
    if(root.right) {
      this.preorderRec(root.right);
    }
    return root;

  }
迭代时间:0.99700001117587

   preOrderIterativ(root) {
if(root === null) {
  return;
}
const stack = [root];
const stack2 = [];
while(stack.length) {
  //const node = stack.pop();
  const node = stack.pop();
  stack2.push(node)
  if(node.left) {
    stack.push(node.left)
  }
  if(node.right) {
    stack.push(node.right)
  }
}

return stack2;
} }


解决方案:问题在于while循环中的console.log。我使用repl.it作为编辑器,在删除console.log之后,性能得到了改进

在迭代解决方案上,您正在使用另一个数据结构(
数组
)。除此之外,您还不断执行插入
推送
和删除
弹出
操作。这些操作中的每一个都是时间复杂度
O(n)
。对于递归解决方案,您使用的是
调用堆栈
,这就是
javascript
的运行方式。我不知道这是什么大O。

这是完整的代码吗?您的预排序函数遍历树,但不执行任何操作。没有像迭代版本中那样的推送、弹出或返回,迭代版本看起来不会看到超过1个节点。preOrderIterativ函数的逻辑不正确,是上面给出测试结果的同一个程序吗?
java
!=<代码>javascript。来吧,它甚至在这两者的工具提示中都这么说!!!嗨,递归函数只是返回root@NicholasTower
preorderec
代码记录所有节点数据
preOrderIterativ
有缺陷,只记录树根的数据,因为它从不迭代子级。Ok奇怪。我怎样才能使它成为堆栈?我认为添加和删除操作是O(1)。我不明白数组和堆栈的不同之处。如果我创建一个函数add而不是使用push功能,那有什么不同呢?您可以手动创建一个链表并将其用作堆栈。这将为您提供O(1)插入和删除。