题目
判断给定的二叉树是否为二叉查找树
方法1
递归判断:先判断左子树是否为二叉查找树;再判断右子树;最后判断根(根小于左子树的最大节点值,大于右子树的最左节点值);
public boolean isValidBST(TreeNode root){
if(root==null){
return true;
}
if(root.left==null && root.right==null){
return true;
}
boolean l=isValidBST(root.left);
boolean r=isValidBST(root.right);
boolean res=l && r;
if(root.left!=null){
TreeNode lnode=root.left;
while(lnode.right!=null){
lnode=lnode.right;
}
if(lnode.val<root.val){
res=res && true;
}else{
res=false;
}
}
if(root.right!=null){
TreeNode rnode=root.right;
while(rnode.left!=null){
rnode=rnode.left;
}
if(rnode.val>root.val){
res=res && true;
}else{
res=false;
}
}
return res;
}
方法2
利用二叉查找树的性质:二叉查找树的中序遍历是有序的(从小到大);
先进行中序遍历得到中序序列,再判断中序序列是否有序;
public boolean isValidBST(TreeNode root){
ArrayList<Integer> inOrderList=new ArrayList<Integer>();
inOrder(inOrderList,root);
for(int i=0;i<inOrderList.size()-1;i++){
if(inOrderList.get(i)>=inOrderList.get(i+1)){
return false;
}
}
return true;
}
//得到中序序列
private void inOrder(ArrayList<Integer> inOrderList, TreeNode root) {
if(root==null){
return;
}
inOrder(inOrderList,root.left);
inOrderList.add(root.val);
inOrder(inOrderList,root.right);
}