LeetCode 98.验证二叉搜索树

226 阅读2分钟

一、题目详情

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:

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

示例:

输入:
    5
   / \
  1   4
     / \
    3   6
输出:false
解释:输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4

二、思路

根据题目中的信息,以及代码提示中有关树节点的定义:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
      	this.val = val;
        this.left = left;
        this.right = right;
    }
}

我们可以知道,对于二叉搜索树上的任何一个节点,它的取值都有一个范围,如下图: search_tree 对于节点A的范围是(-∞,+∞),C的范围是(A.val,+∞),F的范围是(A.val,C.val)。
假设任意父节点X的取值范围是(low,high),那么对于X的左子节点的范围是(low,X.val),对于X的右子节点的范围则是(X.val,high)。
根据这些信息,我们可以采用递归调用的方法,查询子树中所有节点的值是否都在指定的区间范围内。

三、代码

class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE);
    }
    /**
     * 判断以node为根节点的子树,是否所有节点的值都在(low,high)这个范围内
     * 需要比较node子树中的所有节点
     */
    public boolean isValidBST(TreeNode node,long low,long high) {
	if(node==null)
            return true;
	//如果当前节点不在这个范围,就返回false 
	if(node.val<=low || node.val>=high) {
            return false;
	}
	//如果当前节点在这个范围,就判断左子树和右子树的节点是否都在取值范围内
	return isValidBST(node.left,low,node.val) && isValidBST(node.right,node.val,high);
    }
}

qrcode2.png