检查二叉搜索树是否有效 javascript
Checking if a Binary Search Tree is Valid javascript
我在网上遇到了这个问题,我发现了以下函数来检查 BST 是否有效。但是,我不完全理解的是 max/min 如何从 null 变为您可以比较的值。所以在下面的函数中:
//Give the recursive function starting values:
function checkBST(node) {
// console.log(node.right);
return isValidBST(node, null, null);
}
function isValidBST(node, min, max) {
console.log(min, max);
if (node === null) {
return true;
}
if ((max !== null && node.val > max) || (min !== null && node.val < min)) {
return false;
}
if (!isValidBST(node.left, min, node.val) || !isValidBST(node.right, node.val, max)) {
return false;
}
return true;
}
var bst = new BinarySearchTree(8);
bst.insert(3);
bst.insert(1);
bst.insert(6);
bst.insert(10);
bst.insert(4);
当您从左侧的最低深度返回时,它会将最低深度的值与其正上方的深度进行比较(即输出 1 3 时)。不知何故 min 从 null 变为 1 而我没有看到如何,我在想你需要某种基本情况才能将最小值从 null 变为其他......
当我在每个 运行.
上 console.log min/max 时,我在控制台中得到了这个
null null
null 8
null 3
null 1
1 3
3 8
3 6
3 4
4 6
6 8
8 null
8 10
10 null
变量 min
变为非空,因为您显式调用
isValidBST(node.right, node.val, max)
您将 node.val 作为参数 min
传递的位置。一定是在您进行此调用时 node.val
不为空;
给定一个节点,验证二叉搜索树,
确保每个节点的左手 child 是
小于 parent 节点的值,并且
每个节点的右手 child 大于
parent
class Node {
constructor(data) {
this.data = data;
this.left = null;
this.right = null;
}
}
class Tree {
constructor() {
this.root = null;
}
isValidBST(node, min = null, max = null) {
if (!node) return true;
if (max !== null && node.data >= max) {
return false;
}
if (min !== null && node.data <= min) {
return false;
}
const leftSide = this.isValidBST(node.left, min, node.data);
const rightSide = this.isValidBST(node.right, node.val, max);
return leftSide && rightSide;
}
}
const t = new Node(10);
t.left = new Node(0);
t.left.left = new Node(7);
t.left.right = new Node(4);
t.right = new Node(12);
const t1 = new Tree();
t1.root = t;
console.log(t1.isValidBST(t));
另一种解决方案可能是:
const isValidBST = (
root,
min = Number.MIN_SAFE_INTEGER,
max = Number.MAX_SAFE_INTEGER
) => {
if (root == null) return true;
if (root.val >= max || root.val <= min) return false;
return (
isValidBST(root.left, min, root.val) &&
isValidBST(root.right, root.val, max)
);
};
检查二叉搜索树是否有效:
class BTNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
/**
*
* @param {BTNode} tree
* @returns {Boolean}
*/
const isBinarySearchTree = (tree) => {
if (tree) {
if (
tree.left &&
(tree.left.value > tree.value || !isBinarySearchTree(tree.left))
) {
return false;
}
if (
tree.right &&
(tree.right.value <= tree.value || !isBinarySearchTree(tree.right))
) {
return false;
}
}
return true;
};
我在网上遇到了这个问题,我发现了以下函数来检查 BST 是否有效。但是,我不完全理解的是 max/min 如何从 null 变为您可以比较的值。所以在下面的函数中:
//Give the recursive function starting values:
function checkBST(node) {
// console.log(node.right);
return isValidBST(node, null, null);
}
function isValidBST(node, min, max) {
console.log(min, max);
if (node === null) {
return true;
}
if ((max !== null && node.val > max) || (min !== null && node.val < min)) {
return false;
}
if (!isValidBST(node.left, min, node.val) || !isValidBST(node.right, node.val, max)) {
return false;
}
return true;
}
var bst = new BinarySearchTree(8);
bst.insert(3);
bst.insert(1);
bst.insert(6);
bst.insert(10);
bst.insert(4);
当您从左侧的最低深度返回时,它会将最低深度的值与其正上方的深度进行比较(即输出 1 3 时)。不知何故 min 从 null 变为 1 而我没有看到如何,我在想你需要某种基本情况才能将最小值从 null 变为其他...... 当我在每个 运行.
上 console.log min/max 时,我在控制台中得到了这个null null
null 8
null 3
null 1
1 3
3 8
3 6
3 4
4 6
6 8
8 null
8 10
10 null
变量 min
变为非空,因为您显式调用
isValidBST(node.right, node.val, max)
您将 node.val 作为参数 min
传递的位置。一定是在您进行此调用时 node.val
不为空;
给定一个节点,验证二叉搜索树, 确保每个节点的左手 child 是 小于 parent 节点的值,并且 每个节点的右手 child 大于 parent
class Node {
constructor(data) {
this.data = data;
this.left = null;
this.right = null;
}
}
class Tree {
constructor() {
this.root = null;
}
isValidBST(node, min = null, max = null) {
if (!node) return true;
if (max !== null && node.data >= max) {
return false;
}
if (min !== null && node.data <= min) {
return false;
}
const leftSide = this.isValidBST(node.left, min, node.data);
const rightSide = this.isValidBST(node.right, node.val, max);
return leftSide && rightSide;
}
}
const t = new Node(10);
t.left = new Node(0);
t.left.left = new Node(7);
t.left.right = new Node(4);
t.right = new Node(12);
const t1 = new Tree();
t1.root = t;
console.log(t1.isValidBST(t));
另一种解决方案可能是:
const isValidBST = (
root,
min = Number.MIN_SAFE_INTEGER,
max = Number.MAX_SAFE_INTEGER
) => {
if (root == null) return true;
if (root.val >= max || root.val <= min) return false;
return (
isValidBST(root.left, min, root.val) &&
isValidBST(root.right, root.val, max)
);
};
检查二叉搜索树是否有效:
class BTNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
/**
*
* @param {BTNode} tree
* @returns {Boolean}
*/
const isBinarySearchTree = (tree) => {
if (tree) {
if (
tree.left &&
(tree.left.value > tree.value || !isBinarySearchTree(tree.left))
) {
return false;
}
if (
tree.right &&
(tree.right.value <= tree.value || !isBinarySearchTree(tree.right))
) {
return false;
}
}
return true;
};