算法学习:98.验证二叉搜索树

验证二叉搜索树

题目链接:转载力扣
难度:中等
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例
算法学习:98.验证二叉搜索树_第1张图片
输入:root = [2,1,3]
输出:true

思路

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

错误:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。
样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。

此时可以初始化比较元素为longlong的最小值。
因为 BST 左小右大的特性是指 root.val 要比左子树的所有节点都更大,要比右子树的所有节点都小,你只检查左右两个子节点当然是不够的。

正确解法是通过使用辅助函数,增加函数参数列表,在参数中携带额外信息,将这种约束传递给子树的所有节点,这也是二叉搜索树算法的一个小技巧吧。

二叉树的结点定义

 //二叉树节点的定义。
 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;
     }
}

递归代码

class Solution {
    public boolean isValidBST(TreeNode root) {
		return isValidBST(root,null,null);
    }
    /* 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val */
    private boolean isValidBST(TreeNode root,TreeNode min,TreeNode max){
		if(root == null)	return true;	
		// 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
		if(min != null && min.val >= root.val)	return false;
		if(max != null && max.val <= root.val)	return false;
		// 限定左子树的最大值是 root.val,右子树的最小值是 root.val
		return isValidBST(root.left,min,root) && isValidBST(root.right,root,max);
	}
}

你可能感兴趣的:(数据结构与算法,java,算法,数据结构)