给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
// 1、递归直接求解
var isValidBST = function(root, min = null, max = null) {
if (root === null) {
return true;
}
if ((min !== null && root.val <= min) || (max !== null && root.val >= max)) {
return false;
}
return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
};
// 2、中序遍历再排序
var isValidBST = function(root) {
let prevValue = -Infinity; // 用于保存上一个遍历到的节点值
// 中序遍历函数
function inorderTraversal(node) {
if (!node) {
return true; // 空节点是有效的二叉搜索树
}
// 遍历左子树
if (!inorderTraversal(node.left)) {
return false;
}
// 当前节点值小于等于上一个遍历到的节点值,不是有效的二叉搜索树
if (node.val <= prevValue) {
return false;
}
prevValue = node.val; // 更新上一个节点值
// 遍历右子树
if (!inorderTraversal(node.right)) {
return false;
}
return true;
}
return inorderTraversal(root);
};