我正在跟踪来自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();
答案 0 :(得分:4)
所以这是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旨在满足这样的目的。在进行插入时,其数据的结构避免了遍历整个树的需要。它的值是有序排列的,因此查找最小值/最大值时不必遍历每个节点。如果您的算法需要,则说明您没有正确使用它,甚至该函数也产生了正确的逻辑输出。
答案 1 :(得分:1)
根据定义,BST的按顺序遍历将返回排序后的值。
insert()
进行了比较并执行了此逻辑。
按顺序遍历等效于从左到右扫描节点(您可以手动尝试)。我们不关注叶节点。 107节点(105所在的位置)的左子树中的所有内容都小于107。
这是您的BST:
{
"value": 50,
"left": {
"value": 30,
"left": {
"value": 20,
"left": { "value": 10, "left": null, "right": null },
"right": null
},
"right": {
"value": 45,
"left": { "value": 35, "left": null, "right": null },
"right": null
}
},
"right": {
"value": 70,
"left": {
"value": 60,
"left": { "value": 59, "left": null, "right": null },
"right": null
},
"right": {
"value": 107,
"left": {
"value": 85,
"left": null,
"right": { "value": 105, "left": null, "right": null }
},
"right": null
}
}
}
有关BST的更多信息,请参见此处:
VisuAlgo - Binary Search Tree, AVL Tree
答案 2 :(得分:0)
因此,如果我正确地理解了您的问题,答案是,由于二叉树的结构方式,getMaxVal和getMinVal方法仅需要按顺序尽可能地向右或向左移动找到正确的值。如果您看一下insert方法,则该比较已经“融入”了由对该方法的一系列调用所创建的“树”的结构。当我们在105上调用insert时,它将最终放置在85的“ right”属性中,该属性本身就是107的“ left”属性。getMaxVal函数只是利用了insert方法确保没有值的事实。低于最大值的值可以插入到该值的右边。实际上,在任何时间点上最大的插入值永远都不会是正确的,因此我们可以向右遍历树,直到达到没有“正确”属性的值为止,并且我们知道那就是树中的最大值。
希望有帮助!