LeetCode - 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. Example 1: Input: 2 / \ 1 3 Output: true Example 2: 5 / \ 1 4 / \ 3 6 Output: false Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value is 5 but its right child's value is 4.
如果对BST 中序遍历, 会产生有序数列。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { //BST inorder traverse will generate a ordered sequnence public boolean isValidBST(TreeNode root) { if(root == null){ return true; } List<Integer> list = new ArrayList<>(); list.add(null); return helper(root, list); } public boolean helper(TreeNode node, List<Integer> list){ if(node == null){ return true; } boolean left = helper(node.left, list); if(list.get(list.size()-1) != null && node.val <= list.get(list.size()-1)){ return false; } list.add(node.val); boolean right = helper(node.right, list); return left && right; } }
非递归法:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { //BST inorder traverse will generate a ordered sequnence public boolean isValidBST(TreeNode root) { if(root == null){ return true; } Stack<TreeNode> stack = new Stack<>(); List<Integer> list = new ArrayList<>(); TreeNode p = root; while(p != null || !stack.isEmpty()){ if(p != null){ stack.push(p); p = p.left; } else{ TreeNode t = stack.pop(); if(list.size() != 0 ){ if(t.val > list.get(list.size()-1)){ list.add(t.val); } else{ return false; } } else{ list.add(t.val); } p = t.right; } } return true; } }
二刷, 根据二叉树原理进行递归:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isValidBST(TreeNode root) { if(root == null){ return true; } return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long min, long max){ if(root == null){ return true; } if(root.val <= min || root.val >= max){ return false; } return (isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max)); } }
posted on 2018-05-23 11:53 IncredibleThings 阅读(103) 评论(0) 编辑 收藏 举报