- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是我用来查找二叉搜索树 (BST) 的最小高度的代码。原始来源为here 。这里使用的最小高度的定义是从根节点到第一个不包含两个子节点的叶节点的距离。通过大量使用 console.logs,除了倒数第二个高度更新之外,我已经了解了所有内容。
如果运行下面的代码,倒数第五条日志表示:右为-1,左为-1,我理解。但是,它后面的日志指示更新“right”递归调用的值,将 right 的值设置为“right + 1”。 (因为右为 -1。-1 + 1 = 0)
因此,我期望以下结果:左 = -1,右 = 0。
最后递归调用后,再次将right设置为right + 1,我期望最终结果为Left:-1,right:1。
但是,输出是:左0,右:0。然后最终更新后,左:0,右:1。
那么,我错过了什么?左右变量如何同时更新?
/* Binary Search Tree */
class Node {
constructor(data, left = null, right = null) {
this.data = data;
this.left = left;
this.right = right;
}
}
class BST {
constructor() {
this.root = null;
}
add(data) {
const node = this.root;
if (node === null) {
this.root = new Node(data);
return;
} else {
const searchTree = function(node) {
if (data < node.data) {
if (node.left === null) {
node.left = new Node(data);
return;
} else if (node.left !== null) {
return searchTree(node.left);
}
} else if (data > node.data) {
if (node.right === null) {
node.right = new Node(data);
return;
} else if (node.right !== null) {
return searchTree(node.right);
}
} else {
return null;
}
};
return searchTree(node);
}
}
findMinHeight(node = this.root) {
if (node == null) {
console.log("Minus 1")
return -1;
};
console.log("Direction: L on node ", node.data);
let left = this.findMinHeight(node.left);
console.log("Direction: R on node ", node.data);
let right = this.findMinHeight(node.right);
console.log("RIGHT", right, "left", left)
if (left < right) {
console.log('Result = the value of LEFT + 1');
return left + 1;
} else {
console.log('Result = the value of right + 1');
return right + 1;
};
}
}
const bst = new BST();
bst.add(9);
bst.add(4);
bst.add(17);
bst.add(3);
// bst.add(6);
// bst.add(22);
// bst.add(5);
// bst.add(7);
// bst.add(20);
console.log(bst.findMinHeight());
最佳答案
要理解findMinHeight函数(下面我简化为f(node)),我认为有2个关键
在 BST 的最底部,级别 (4,7,13)
case all: current node has no children at all.
node.left=null => return -1
node.right=null => return -1
left!<right => return right+1=0 //(-1+1=0)
f(4)=f(7)=f(13)=0
进入下一级别,(1,6,14)
case 1: current node has no children at all.
node.left=f(null) => return -1
node.right=f(null) => return -1
left!<right => return right+1=0 //(-1+1=0)
f(1)=0
case 6: current node has two children.
node.left=f(4) => return 0
node.right=f(7) => return 0
left!<right => return right+1=1 //(0+1=1)
f(6)=1
case 14: current node has no children on the right.
node.left=f(13) => return 0
node.right=null => return -1
left!<right => return right+1=0 //(-1+1=0)
f(14)=0
进入下一个级别(3,10),反之亦然,当向上传递值到下一个lvl时,下一个lvl节点返回其当前的minHeight,直到BST的顶部(8),根级别如果把BST上每个节点返回的值写在它旁边,那就一目了然了。希望它可以帮助其他难以理解这一点的人。
关于javascript - 在二叉搜索树上查找最小高度 - 如何跟踪高度的倒数第二个更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58384594/
如果我有一个变量 8589934592 示例: var a = (8589934592 | 0); //a is 0 var b = (8589934591223 | 0); //b
随着我们提高音阶,音符频率增加; #define A4 440 // These are the frequencies of the notes in herts #define A
我有一个这样组织的列表: [('down', 0.0098000000000000309), ('up', 0.0015000000000000568), ('down', 0.00890000000
如果我有一个多项式 P,有没有办法计算 P^-1 模 Q,即 Q 是另一个多项式?我知道这两个多项式的系数都属于以 z 为模的整数域,即 z 是一个整数。 我不确定 SymPy 是否已经在其 galo
对于给定的文件,我可以向后计算行数吗?即从 EOF 开始,计算行数直到开始? 我可以 fseek 到文件末尾。从那里开始,继续寻找新行字符(新行的指示)并继续增加我的 line_number 计数。但
有什么方法可以编写带除法的 C 代码来命令编译器在代码中需要常规除法精度的几个特定位置不使用快速除法(通过倒数数学),即使在全局允许倒数数学的情况下也是如此? 理想情况下,有一种方法不是特定于编译器的
我正在尝试将照片从我计算机上的本地文件导入到我的 HTML 文件中。我已经设法做到了,但它是按升序排列的。我尝试添加一个变量 JavaScript $(document).ready( functio
我正在尝试使用 commons-math 计算 2 尾学生分布的逆。我正在使用 Excel 来比较值并验证结果是否正确。 所以使用excel计算TINV,自由度为5,我使用95.45% =TINV(0
我有一个 jQuery 相机插件,它使用以下命令来拍摄快照。 这是它运行的代码。 function take_snapshot() { // take snapshot and get i
我刚刚学会了训练 brain.js network 并且只是在玩它。然后我很好奇是否可以采取相反的方式 - 从输出预测输入? 这是我的代码 const brain = require('brain.j
如果精度不重要,有什么方法可以提高速度的倒数(X 的除法 1)? 所以,我需要计算 1/X。是否有一些解决方法让我失去精度但做得更快? 最佳答案 𝗛𝗲𝗿𝗲𝗛𝗲𝗿𝗲𝗛𝗼𝘄𝗧𝗼?
令 N 为整数。如果N = 2536,则反转N为6352。如果N = 1000000,则反转N为1。 给定一个整数 M,其中 1 <= M <= 10^(100000)。 我们需要找到一个整数 N 是
我是一名优秀的程序员,十分优秀!