验证二叉搜索树

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

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

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

点击查看代码
//递归
/**
 * Definition for a binary tree node.
 * public 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,Long.MIN_VALUE,Long.MAX_VALUE);
    }

    //递归,                        传入当前节点,左边界,  右边界
    public boolean isValidBST(TreeNode node,long lower,long upper){
        //判断当前的节点是否为 null 说明二叉树递归完了返回 true
        if(node == null){
            return true;
        }
        //判断当前节点的值是否满足条件  为左子节点 大于lower 小于根节点值;为右子节点 大于根节点 小于 upper
        if(node.val <= lower || node.val >= upper){
            return false;
        }
        //递归,传入为当前节点的左子节点时,需要小于根节点,大于长整型最小值,
        //     传入为当前节点的右子节点时,需要大于根节点,小于长整型最大值。
        return isValidBST(node.left,lower,node.val) && isValidBST(node.right,node.val,upper);
    }
}
//中序遍历
class Solution {
    public boolean isValidBST(TreeNode root) {
        //定义一个栈,存储各个子节点
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        //定义一个数存储 inorder 值 为初始节点的 inorder 值
        double inorder = -Double.MAX_VALUE;
        //迭代,直到栈为空或者节点为 null 时
        while(!stack.isEmpty() || root != null){
            //当节点不为空 迭代将当前节点与所有左子节点入栈
            while(root != null){
                //将当前节点入栈
                stack.push(root);
                //当前节点变为节点的左子节点
                root = root.left;
            }
            //节点为空,将节点出栈
            root = stack.pop();
            //如果中序遍历得到的节点值小于等于前一个 inorder,说明非二叉搜索树
            if(root.val <= inorder){
                return false;
            }
            //左子节点要始终小于父节点值 inorder 值变为当前节点值
            inorder = root.val;
            //当前节点变为右子节点
            root = root.right;
        }
        //遍历结束,返回 true
        return true;
    }

   
}
示例 1:

输入:root = [2,1,3]
输出:true
示例 2:

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

错误版本
public boolean isValidBST(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int index = 1;
        Map<Integer,List<Integer>> nodes = new HashMap<>();
        while(queue.size()>0){
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            for(int i = 0;i<size;i++){
                TreeNode tmp = queue.get(i);
                list.add(tmp);
                if(i == 1 && tmp.val > nodes.get(index).get(i)){
                    return false; 
                }
                else if(i == 2 && tmp.val <nodes.get(index).get(i)){
                    return false;
                }
                if(tmp.left != null){
                    queue.add(tmp.left);
                }
                if(tmp.right != null){
                    queue.add(tmp.right);
                }
            }
            nodes.add(index,tmp);
        }
        return true;
    }
posted @ 2022-07-04 11:10  xy7112  阅读(27)  评论(0)    收藏  举报