leetcode-验证二叉搜索树

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

假设一个二叉搜索树具有如下特征:

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

示例 1:

输入:
    2
   / \
  1   3
输出: true

示例 2:

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


思路:了解中序遍历的过程,利用中序遍历,将所有的数组取出,如果是取出的数字形成数组是从小到大排列的,则说明是探索二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
    List<Integer> list=new ArrayList();
    public boolean isValidBST(TreeNode root) {
       inOrder(root,list);
        for(int i=1;i<list.size();i++){                           //取出的值与上一个值进行比较
            int temp=list.get(i-1);
            if(temp>=list.get(i))return false;
        }
        return true;
    }
    public void inOrder(TreeNode root,List list){                //中序遍历!
        if(root==null)return;
        inOrder(root.left,list);
        list.add(root.val);                                               //中序遍历是先访问左子树,进行操作之后,再访问右子树
        inOrder(root.right,list);
    }
    
    }

方法二:初始化时带入系统最大值和最小值,在递归过程中换成它们自己的节点值,用long代替int就是为了包括int的边界条件,代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValid(root,Long.MIN_VALUE,Long.MAX_VALUE);
    }
    public boolean isValid(TreeNode root,long a,long b){         //递归函数式,分别向左子树和右子树递归
        if(root==null)return true;
        if(root.val<=a||root.val>=b)return false;    //若为结点的左子树,比节点的值大,或者是结点的右子树,比结点的值小,都返回False
        return isValid(root.left,a,root.val)&&isValid(root.right,root.val,b);    //将左子树和右子树递归
    }
}

猜你喜欢

转载自www.cnblogs.com/patatoforsyj/p/9491320.html