[英]Binary search tree recursion issue
我创建了一个排列数字的二叉树。 左侧小于节点 go 的数字和右侧大于节点 go 的数字。
我有一棵树 object 有一个根。 我后来将第一个节点设置为根。 node 是另一个 object,由 Node 构造函数构造而成,其左值和右值分别为 arguments。
function Node(val){
this.value = val;
this.left = null;
this.right = null;
}
我后来根据val
的值将左右分支设置为节点。
Node.prototype.branch= function(n){ //n is a New node
if(this.value > n.value){
this.left = n;
}else if (this.value < n.value){
this.right = n;
}
}
我试图使用递归 function 遍历树。 我访问每个节点并打印最低值。
Node.prototype.visit = function(){
if(this.left != null){
this.left.visit();
}
console.log(this.value)
if(this.right != null){
this.right.visit();
}
}
上面的 function 工作完美,并按升序打印所有数字....但我不明白它如何进入最小节点,打印值并返回到前一个节点......所以如果有人能给我一个解释这将非常有帮助。 谢谢
更新:我添加了一张图片以获得清晰的解释。
据我了解您的问题,您被困在递归堆栈之间的某个地方,每次您在其内部调用相同的 function 时都会维护该递归堆栈。 以这种方式,每个 function 都会自行堆叠,直到它遇到 return 语句,最终每个 function 开始弹出并清除调用堆栈/递归堆栈。
让我试着解释一下你的情况。
在您访问 function 时,您继续访问左节点,直到找到没有左子节点的节点。 到那时,您已将访问的每个左侧节点添加到调用堆栈中,当您访问 function 返回时,这些节点最终将返回。
现在,当您位于没有左子节点的节点时,您记录其数据,这是树中最小的节点。 我希望直到现在都清楚。
在那之后...
您再次开始将您刚刚注销的节点的任何右子节点推入调用堆栈。
这再次将右子节点添加到调用堆栈,然后对其执行访问 function,然后注销您的第二小的节点。
我在这里看到的问题是您在访问 function 结束时没有使用 return 语句。 因此,function 在碰到右花括号后将自行退出。
我希望我能把事情弄清楚一点。 谢谢。
PS:在图片中,请注意,当我记录“1”时,我错误地将其称为步骤4。请称其为4.1,您不会在理解rest时受到影响。 此外,此图像仅在您没有真正访问 null 孩子的情况下才解释了您的问题。 您只需检查它的孩子是否是 null 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.