侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【二叉树】验证二叉搜索树

GabrielxD
2022-04-13 / 0 评论 / 0 点赞 / 146 阅读 / 658 字
温馨提示:
本文最后更新于 2022-07-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
## 题目

98. 验证二叉搜索树


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

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

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

示例 1:

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

示例 2:

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

注意:

  • 树中节点数目范围在[1, 10^4]
  • -2^31 <= Node.val <= 2^31 - 1

解题

方法一:递归

思路

如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。

使用两个变量记录当前节点合法时的最小边界(minBound)和最大边界(maxBound),则

$rootVal\in[-2^{31}, 2^{31}-1]$

$rLVal\in[-2^{31}, rootVal)$ $rRVal\in(rootVal, 2^{31}-1]$

$rLLVal\in[-2^{31}, rLVal)$ $rLRVal\in(rLVal, rootVal)$

$rRLVal\in(rootVal, rRVal)$ $rRRVal\in(rRVal, 2^{31}-1]$

代码

/**
 * 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 minBound, long maxBound) {
        if (node == null) {
            return true;
        }
        if (node.val <= minBound || node.val >= maxBound) {
            return false;
        }

        return isValidBST(node.left, minBound, node.val) &&
                isValidBST(node.right, node.val, maxBound);
    }
}

方法二:中序遍历

思路

中序遍历 BST 一定是真升序的,如果遍历到当前节点值 $\le$ 前一个节点值为不是 BST。

代码

迭代
/**
 * 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) {
        Stack<TreeNode> nodeStack = new Stack<>();
        long prevVal = Long.MIN_VALUE;
        while(!nodeStack.isEmpty() || root != null) {
            while (root != null) {
                nodeStack.push(root);
                root = root.left;
            }

            root = nodeStack.pop();
            if (root.val <= prevVal) {
                return false;
            }
            prevVal = root.val;
            root = root.right;
        }

        return true;
    }
}
递归
/**
 * 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 long preVal = Long.MIN_VALUE;

    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        if (!isValidBST(root.left) || root.val <= preVal) {
            return false;
        }
        preVal = root.val;
        return isValidBST(root.right);
    }
}
0

评论区