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

来源:互联网 发布:免费cms文章系统 编辑:程序博客网 时间:2024/06/07 13:45

原题网址: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;    }}


0 0
原创粉丝点击