Javascript 为什么在遍历树时超过了调用堆栈的最大大小?

Javascript 为什么在遍历树时超过了调用堆栈的最大大小?,javascript,data-structures,Javascript,Data Structures,我试图从我的二叉树中获取最小值,但是我得到一个错误,超过了最大调用堆栈大小。如何正确获取二进制搜索树中项目的最小值 以下是我的代码: 功能节点(val){ this.value=val; this.left=null; this.right=null; } 函数BinarySearchTree(){ this.root=null; } BinarySearchTree.prototype.minNode=函数(){ var node=this.root; 如果(!节点){ 返回0; } if(节

我试图从我的二叉树中获取最小值,但是我得到一个错误,超过了最大调用堆栈大小。如何正确获取二进制搜索树中项目的最小值

以下是我的代码:

功能节点(val){
this.value=val;
this.left=null;
this.right=null;
}
函数BinarySearchTree(){
this.root=null;
}
BinarySearchTree.prototype.minNode=函数(){
var node=this.root;
如果(!节点){
返回0;
}
if(节点左){
返回此.minNode(node.left)
}
返回node.value
}
BinarySearchTree.prototype.push=函数(val){
var root=this.root;
如果(!root){
this.root=新节点(val);
返回;
}
var currentNode=root;
var newNode=新节点(val);
while(当前节点){
if(val
就像提到的@AndrewLi一样。您正在通过写入来再次设置相同的根

var node = this.root;
而是更改函数的定义

BinarySearchTree.prototype.minNode =function(nextNode) {
    var node = nextNode || this.root;
    if(!node){
        return 0;
    }
    if(node.left){
        return this.minNode(node.left)
    }
    return node.value
}

问题是,在遍历节点时没有推进节点。只需将
node
设置为根元素,它就会永远递归。这样定义函数应该是可行的:

BinarySearchTree.prototype.minNode = function(nextNode) {
  var node = nextNode || this.root;
  if(!node) {
    return 0;
  }
  if(node.left) {
    return this.minNode(node.left)
  }
  return node.value
}

这将使函数接受下一个节点的参数。然后它将
节点
分配给下一个节点(如果它存在),或者根节点(如果它是第一个调用)。这不会永远重复,因为它会前进并遍历树。

您没有前进
节点
。您在每个递归中将其设置为根。它不是当前的吗?正确的方法是什么。t获取最小值您要么需要将其作为参数传递给递归方法,要么需要在实例上保留
.currentSearchNode
属性,并使用该属性而不是
this.root
,以便跟踪您的位置。注意,对于任何有意义的数据集,这仍然很容易使堆栈溢出。JavaScript不擅长处理直接递归。你可以用蹦床来代替。是的,我也在想同样的事情。但是信用应该归你,因为你在评论中第一个回应
BinarySearchTree.prototype.minNode = function(nextNode) {
  var node = nextNode || this.root;
  if(!node) {
    return 0;
  }
  if(node.left) {
    return this.minNode(node.left)
  }
  return node.value
}