Javascript 在js中获取二叉搜索树的最大值
下面是udemy关于二进制搜索树的JS数据结构视频。我们有一个通过递归找到最大值的方法 我想更多的是比较所有的数字,比如Javascript 在js中获取二叉搜索树的最大值,javascript,data-structures,Javascript,Data Structures,下面是udemy关于二进制搜索树的JS数据结构视频。我们有一个通过递归找到最大值的方法 我想更多的是比较所有的数字,比如 BST.prototype.getMaxVal = function() { let num = null; if (num === null) num = this.value; else if (this.value > num) num = this.value; if (this.left) return this.left.getMaxVal(
BST.prototype.getMaxVal = function() {
let num = null;
if (num === null) num = this.value;
else if (this.value > num) num = this.value;
if (this.left) return this.left.getMaxVal();
return num;
}
但答案是
BST.prototype.getMaxVal = function() {
if (this.right) return this.right.getMaxVal();
else return this.value;
}
105是最后一个没有叶子的数字,但是这个方法会在它前面找到107吗?如果没有任何比较逻辑,它是如何发现的
function BST(value) {
this.value = value;
this.left = null;
this.right = null;
}
BST.prototype.insert = function(value) {
if (value <= this.value) {
if (!this.left) this.left = new BST(value);
else this.left.insert(value);
} else {
if (!this.right) this.right = new BST(value);
else this.right.insert(value);
}
return this;
}
const bst = new BST(50);
bst.insert(30);
bst.insert(70);
bst.insert(107);
bst.insert(60);
bst.insert(59);
bst.insert(20);
bst.insert(45);
bst.insert(35);
bst.insert(85);
bst.insert(105);
bst.insert(10);
bst.getMaxVal();
因此,如果我正确理解了您的问题,那么答案是,由于二叉树的结构,getMaxVal和getMinVal方法只需分别向左或向右,就可以找到正确的值。如果查看insert方法,比较已经嵌入到由对该方法的一系列调用创建的树的结构中。当我们在105上调用insert时,它最终将被放置在85的右属性中,这本身就是107的左属性。getMaxVal函数只是利用了这样一个事实,即insert方法确保不能将低于最大值的值插入到该值的右侧。事实上,在任何时间点上插入的最大值都不会有任何正确的值,因此我们可以沿着树向右遍历,直到到达一个没有正确属性的值,我们知道这是树中的最大值
希望有帮助 因此,如果我正确理解了您的问题,那么答案是,由于二叉树的结构,getMaxVal和getMinVal方法只需分别向左或向右,就可以找到正确的值。如果查看insert方法,比较已经嵌入到由对该方法的一系列调用创建的树的结构中。当我们在105上调用insert时,它最终将被放置在85的右属性中,这本身就是107的左属性。getMaxVal函数只是利用了这样一个事实,即insert方法确保不能将低于最大值的值插入到该值的右侧。事实上,在任何时间点上插入的最大值都不会有任何正确的值,因此我们可以沿着树向右遍历,直到到达一个没有正确属性的值,我们知道这是树中的最大值
希望有帮助 这是BST的可视化表示。如果某个值小于您的值,则将其传递到左侧,并让左侧子BST决定将其放置在何处。如果某个值大于您的值,请将其传递到右侧的子BST,并让它决定将该值放置在何处 在此设置中,可以保证,在最左边的叶上,它必须是最小的值,在最右边的叶上,它包含最大的值。因此,这个想法是关于,从BST的每个角度来看,要么他的左树什么都没有,要么它的值一定比我小。因此,算法写道:
BST.prototype.getMinVal = function() {
// if left tree is not null, it must be smaller tha me. Return its value
if (this.left) return this.left.getMinVal();
// if left tree is null, indicate i'm the smallest available, return me instead.
else return this.value;
}
更新1
有一件事需要注意。BST就是为了达到这样的目的而设计的。在进行插入时,其数据的结构避免了整个树遍历的需要。它的值是有序的,因此在查找最小/最大值时不必遍历每个节点。如果您的算法需要,您没有正确使用它,甚至函数也会产生正确的逻辑输出。因此这是BST的视觉表示。如果某个值小于您的值,则将其传递到左侧,并让左侧子BST决定将其放置在何处。如果某个值大于您的值,请将其传递到右侧的子BST,并让它决定将该值放置在何处 在此设置中,可以保证,在最左边的叶上,它必须是最小的值,在最右边的叶上,它包含最大的值。因此,这个想法是关于,从BST的每个角度来看,要么他的左树什么都没有,要么它的值一定比我小。因此,算法写道:
BST.prototype.getMinVal = function() {
// if left tree is not null, it must be smaller tha me. Return its value
if (this.left) return this.left.getMinVal();
// if left tree is null, indicate i'm the smallest available, return me instead.
else return this.value;
}
更新1
有一件事需要注意。BST就是为了达到这样的目的而设计的。在进行插入时,其数据的结构避免了整个树遍历的需要。它的值是有序的,因此在查找最小/最大值时不必遍历每个节点。如果您的算法需要,那么您没有正确使用它,甚至函数也会产生正确的逻辑输出。根据定义,按顺序遍历BST将返回排序后的值。 insert进行了比较并实施了这一逻辑 顺序遍历相当于从左到右扫描节点,您可以手动尝试。我们不关注叶节点。105所在的107节点左子树中的任何内容都小于107 这是你的BST: { 价值:50, 左:{ 数值:30, 左:{ 价值:20, 左:{value:10,左:null,右:null}, 右:如新 陆上通信线 }, 对:{ 数值:45, 左:{value:35,左:null,右:null}, 右:空 } }, 对:{ 价值:70, 左:{ 价值:60, 左:{value:59,左:null,右:null}, 右:空 }, 对:{ 价值:107, 左:{ 价值:85, 左:空, 右:{值:105,左:null,右:null} }, 右:空 } } } 有关BST的更多信息,请参见此处:
根据定义,按顺序遍历BST将返回排序后的值。 insert进行了比较并实施了这一逻辑 顺序遍历相当于从左到右扫描节点,您可以手动尝试。我们不关注叶节点。105所在的107节点左子树中的任何内容都小于107 这是你的BST: { 价值:50, 左:{ 数值:30, 左:{ 价值:20, 左:{value:10,左:null,右:null}, 右:空 }, 对:{ 数值:45, 左:{value:35,左:null,右:null}, 右:空 } }, 对:{ 价值:70, 左:{ 价值:60, 左:{value:59,左:null,右:null}, 右:空 }, 对:{ 价值:107, 左:{ 价值:85, 左:空, 右:{值:105,左:null,右:null} }, 右:空 } } } 有关BST的更多信息,请参见此处:
比较是用插入法完成的。那么你就知道了,obj.left总是更低,obj.right总是更高,right。我的问题是,无比较的getMaxVal函数如何在obj.right上找到最低值?与getMaxVal相同,因为您的入口点是bst50,低于50的值将设置在此对象的左侧,如果新值低于先前设置的较低值,然后它自己的左边将保留这个新的较低的值。如果入口点是最低的值,它只返回它自己。这个问题不是javascript独占的。这是一个一般的BST问题。比较是在insert方法中完成的。那么你就知道了,obj.left总是更低,obj.right总是更高,right。我的问题是,无比较的getMaxVal函数如何在obj.right上找到最低值?与getMaxVal相同,因为您的入口点是bst50,低于50的值将设置在此对象的左侧,如果新值低于先前设置的较低值,然后它自己的左边将保留这个新的较低的值。如果入口点是最低的值,它只返回它自己。这个问题不是javascript独占的。这是一个普通的BST问题。直到我发布了我的答案,我才看到前面的评论——不过getMinValue函数的工作方式是相同的。它利用了这样一个事实,即insert方法永远不能将任何东西放在最小值的左边,除非它插入的东西更低。直到我发布了我的答案,我才看到前面的注释-尽管getMinValue函数的工作方式是相同的。它利用了这样一个事实,即插入方法永远不能将任何东西放在最小值的左边,除非插入的东西更低。