Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在js中获取二叉搜索树的最大值_Javascript_Data Structures - Fatal编程技术网

Javascript 在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(

下面是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();
  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函数的工作方式是相同的。它利用了这样一个事实,即插入方法永远不能将任何东西放在最小值的左边,除非插入的东西更低。