繁体   English   中英

二叉搜索树递归问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM