验证二叉搜索树
Tips
题目
验证一棵树是否为二叉搜索树. 本题中 BST 的特征如下:
- 节点的左子树只包含小于当前节点的数
- 节点的右子树只包含大于当前节点的数
- 所有左子树和右子树自身必须也是二叉搜索树
示例
输入:
2
/ \
1 3
输出: true
题解
方法一: 中序遍历
因为 BST 的中序遍历是有序的, 所以只要保证当前节点的值大于前一个节点的值即可. 因此可以先创建一个 prevNode 节点初始为 null, 走中序遍历即可.
/**
* 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}
*/
var isValidBST = function (root) {
// 初始化前节点, 当然你直接初始化前节点的值也 ok
let prev = null
var inOrderTraverse = function (root) {
if (root === null) return true
// 判断左子树
if (!inOrderTraverse(root.left)) return false
// 如果当前值小于等于了前一个节点的值, 说明不是一棵 BST
if (prev !== null && root.val <= prev.val) return false
// 将 当前节点赋给前一个节点
prev = root
// 判断右子树
if (!inOrderTraverse(root.right)) return false
return true
}
return inOrderTraverse(root)
}
方法二
根据 BST 的定义, 左子树的值要在 (min, mid)
之间, 右子树的值在 (mid, max)
之间.
var isValidBST = function (root) {
return isValid(root, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)
}
var isValid = function (root, min, max) {
if (!root) return true
const mid = root.val
// mid 不在 min 和 max 之间时, 一定不是 BST
if (!(mid > min && mid < max)) return false
return isValid(root.left, min, mid) && isValid(root.right, mid, max)
}