刷题的日常-验证二叉搜索树

86 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

刷题的日常-2022年8月18日

一天一题,保持脑子清爽

验证二叉搜索树

来自leetcode的 98 题,题意如下:

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

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

示例如下: image.png

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

image.png

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

理解题意

我们可以从题意中提取的条件如下:

  • 题目给定一个二叉树
  • 要求我们验证是否是二叉搜索树
  • 返回验证结果

做题思路

二叉树我们知道是有左右两个子树,没有其它限制。而二叉搜索树同样有二叉树的性质,但是做了一些其它方面的限制,如,搜索树的左子树要小于当前节点,搜索树的右子树要大于当前节点,所以我们用前序遍历整棵树,其就是顺序的。

  • 开辟一个栈用来保存中间结果
  • 在遍历的过程中往栈中添加待遍历的数据
  • 我们一开始要一直往左边走,保证第一次访问的是左子树
  • 左子树访问之后,要把它的右子树一并放进栈中,这样就保证了我们是顺序遍历的
  • 在遍历的过程中进行判断
    • 如果当前访问的值小于之前被访问过的值,则不符合搜索树的限制,返回false
    • 其它情况则可以继续遍历
  • 没有遇到不满足条件的情况直接返回true

代码实现

代码实现如下:

class Solution {
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curNode = root;
        double minValue = -Double.MAX_VALUE;
        while (curNode != null || stack.size() > 0) {
            if (curNode != null) {
                stack.push(curNode);
                curNode = curNode.left;
                continue;
            }
            TreeNode popNode = stack.pop();
            if (popNode.val <= minValue) {
                return false;
            }
            minValue = popNode.val;
            curNode = popNode.right;
        }
        return true;
    }
}