给定一个二叉树,判断它是否是合法的二叉查找树(BST)
一棵BST定义为:
- 节点的左子树中的值要严格小于该节点的值。
- 节点的右子树中的值要严格大于该节点的值。
- 左右子树也必须是二叉查找树。
- 一个节点的树也是二叉查找树。
样例
一个例子:
2
/ \
1 4
/ \
3 5
上述这棵二叉树序列化为 {2,1,4,#,#,3,5}
.
解题思路1:
二叉查找树有一个重要的性质:即中序遍历递增(不存在两个节点值相等),根据此,中序遍历完成后,查看序列是否有序即可知道是否是二叉查找树。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/
public boolean isValidBST(TreeNode root) {
// write your code here
List<Integer> list = new ArrayList<>();
isValidBST(root, list);
return isOrder(list);
}
private void isValidBST(TreeNode root, List<Integer> list){
if(root == null)
return;
isValidBST(root.left, list);
list.add(root.val);
isValidBST(root.right, list);
}
private boolean isOrder(List<Integer> list){
for(int i=1 ; i<list.size() ; i++)
if(list.get(i) <= list.get(i-1))
return false;
return true;
}
}
JAVA代码2:非递归方法,类似非递归的中序遍历
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/
public boolean isValidBST(TreeNode root) {
// write your code here
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
while(root!=null || !stack.isEmpty()){
while(root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if(pre!=null && pre.val>=root.val)
return false;
pre = root;
root = root.right;
}
return true;
}
}
解题思路2:
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/
public boolean isValidBST(TreeNode root) {
// write your code here
return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean helper(TreeNode root, long min, long max){
if(root == null)
return true;
if(root.val <= min || root.val >= max)
return false;
return helper(root.left, min, (long)root.val) && helper(root.right, (long)root.val, max);
}
}