刷题42 验证二叉搜索树

39 阅读1分钟

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

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

题解:

  1. 递归

     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) {
             if(node==null) return true;
    
             if(node.val<=lower||node.val>=upper)
                 return false;
    
             return isValidBST(node.left, lower, node.val) && 
                         isValidBST(node.right, node.val, upper);
    
         }
    
     }
     
    

2.中序遍历 有序:

class Solution {
public boolean isValidBST(TreeNode root) {
    Deque<TreeNode> stack = new LinkedList<TreeNode>();
    double inorder = -Double.MAX_VALUE;

    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 = root.val;
        root = root.right;
    }
    return true;
}
}