给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 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 { Listlist=new ArrayList(); public boolean isValidBST(TreeNode root) { inOrder(root,list); for(int i=1;i =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); //将左子树和右子树递归 }}