Binary Search Tree有一个非常重要的性质,它的中序遍历是递增的,这是一个充要条件,可以用它来判断Binary Search Tree,时间复杂度为O(n),代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution{
List<Integer> list = new ArrayList<Integer>(); // record values of nodes
public void inOrderTraversal(TreeNode root){
if(root == null) return;
inOrderTraversal(root.left);
list.add(root.val);
inOrderTraversal(root.right);
}
public boolean isValidBST(TreeNode root){
// Corner case
if(root == null) return true;
if(root.left == null && root.right == null) return true;
inOrderTraversal(root); // perform in-order traversal
// Check if list is ascending order
for(int i = 1; i < list.size(); i++){
if(list.get(i) <= list.get(i - 1)){
return false;
}
}
return true;
}
}
第二种方法同样也用到了BST的上面那个性质,不同的是这种方法不再需要O(n)的额外空间,只用一个TreeNode来记录上一个上一个访问过的节点,然后比较上一个节点和当前这个节点的value即可,时间复杂度为O(n),代码如下:
public class Solution{
// Keep the prevous value in inorder traversal
TreeNode pre = null;
public boolean isValidBST(TreeNode root){
// Traverse the tree inorder
if(root != null){
// Inorder traversal: left first
if(!isValidBST(root.left)) return false;
// Compare it with the previous value in inorder traversal
if(pre != null && root.val <= pre.val) return false;
pre = root; // update the previous value
// Inorder traversal: right last
return isValidBST(root.right);
}
return true;
}
}
知识点:
1. BST的中序遍历性质
2. 遇到二叉树的时候要多多考虑使用分治法,root.left怎样,root.right怎样,当前的root需要满足什么性质