【58.验证二叉搜索树】

97 阅读1分钟

题目

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

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

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

示例 1:

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

题解

需要注意的是,左右子树都是二叉搜索树时,整体不一定是二叉搜索树,当前节点需要大于左子树中最大的节点,小于右子树中最小的节点

方式一:递归

第一时间想到递归的同时维护一个最大值和最小值,如果是右节点就比较右子树的最大值,如果是左节点就比较左子树的最小值,但这样实现起来很麻烦。

题解这种方法就很灵性了,通过范围比较是否符合要求。

public boolean isValidBST(TreeNode root) {
    return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

public boolean isValidBST(TreeNode node, long lower, long upper) {
    if (node == null) {
        return true;
    }
    if (node.val >= upper || node.val <= lower) {
        return false;
    }
    return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
}

方式二:迭代

由题意知道中序遍历后的结果是升序的,如果不是就不是二叉搜索树。

// 迭代实现中序遍历
public boolean isValidBST(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    long last = Long.MIN_VALUE;
    while (!stack.isEmpty() || root != null) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        if (root.val <= last) {
            return false;
        }
        last = root.val;
        root = root.right;
    }
    return true;
}

总结

算法:递归迭代