LeetCode 98. Validate Binary Search Tree(校验二叉搜索树)

时间:2022-09-12 23:56:58

原题网址:https://leetcode.com/problems/validate-binary-search-tree/

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

方法一:递归+自顶向下。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private boolean isValid = true;
private void valid(TreeNode root, Check check) {
if (!isValid) return;
if (root == null) return;
check.min = root.val;
check.max = root.val;
if (root.left != null) {
Check left = new Check();
valid(root.left, left);
check.min = left.min;
if (left.max >= root.val) {
isValid = false;
return;
}
}
if (!isValid) return;
if (root.right != null) {
Check right = new Check();
valid(root.right, right);
check.max = right.max;
if (right.min <= root.val) {
isValid = false;
return;
}
}
}
public boolean isValidBST(TreeNode root) {
valid(root, new Check());
return isValid;
}
}
class Check {
int min;
int max;
}

方法二:递归+分治策略

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private boolean valid(TreeNode root, int min, int max) {
if (root == null) return true;
if (root.val < min || root.val > max) return false;
return
((root.val > Integer.MIN_VALUE && valid(root.left, min, root.val-1))
|| (root.val == Integer.MIN_VALUE && root.left == null))
&&
((root.val < Integer.MAX_VALUE && valid(root.right, root.val+1, max))
|| (root.val == Integer.MAX_VALUE && root.right == null));
}
public boolean isValidBST(TreeNode root) {
return valid(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
}

方法三:按照遍历顺序检查。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
TreeNode prev = null;
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
if (root.left != null) {
boolean left = isValidBST(root.left);
if (!left) return false;
}
if (prev != null && prev.val >= root.val) return false;
prev = root;
if (root.right != null) {
boolean right = isValidBST(root.right);
if (!right) return false;
}
return true;
}
}