LeetCode - 98. 验证二叉搜索树

304 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


原题:98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

解题思路:

验证二叉搜索树的有效性可以从它的定义和特点入手。

从一个有效的二叉搜索树的根结点出发,它的左子树的所有节点的值都比它小,右子树的所有节点的值都比它大,根据跟节点的值,可以分别确定左右子树所有节点的合法取值范围。又因为它的左右子树都符合以上要求,也就是它们都是有效的二叉搜索树,因此,可以进行递归验证。以任何一个节点为起点,根据它的取值范围(跟节点可以取任意值)及自身的值,确定其左右节点的取值范围,如果左右节点的值在取值范围内,并且左右子树都是有效的二叉搜索树,那么就可以通过验证。

另外,递归调用的推出条件是,遍历到了空指针,那么它应该被看作是通过验证的有效节点。

最终代码:

class Solution {
    public boolean isValidBST(TreeNode root) {
        return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
private boolean dfs(TreeNode node, long minValue, long maxValue) {
    return node == null
        || (node.val > minValue
        && node.val < maxValue
        && dfs(node.left, minValue, node.val)
        && dfs(node.right, node.val, maxValue));
    }
}

除了这个方法,还有一个简单的方法。二叉搜索树的中序遍历结果是一个升序数列,因此我们可以对二叉树进行中序遍历,只要遍历到的每一个节点的值都大于上一个遍历到的节点的值,那么这个二叉树就是有效的搜索二叉树。