#LeetCode匠#验证二叉搜索树

102 阅读1分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」。

二叉搜索树同样是我们在项目某些数据结构底层所依赖的一类数据,如何去验证一棵树是否是二叉搜索树呢?

题目描述

给你一个二叉树的根节点 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 isValidateBTee(root, Long.MIN_VALUE, Long.MAX_VALUE);    }    public boolean isValidateBTee(TreeNode node, long min, long max){        if(node == null){            return true;        }        int cur = node.val;        if(cur <= min || cur >= max){            return false;        }        return isValidateBTee(node.left, min, cur) && isValidateBTee(node.right, cur, max);    }}
复制代码

解法二:中序遍历

/** * 中序遍历 */class Solution {    public boolean isValidBST(TreeNode root) {        Deque<TreeNode> stack = new LinkedList<TreeNode>();        double preNodeVal = -Double.MAX_VALUE;        while (!stack.isEmpty() || root != null) {            while (root != null) {                stack.push(root);                root = root.left;            }            root = stack.pop();            // 中序遍历节点值小于等于前一个节点值false            if (root.val <= preNodeVal) {                return false;            }            preNodeVal = root.val;            root = root.right;        }        return true;    }}

LeetCode原题链接:leetcode-cn.com/problems/va…