二叉搜索树:
又:二叉查找树(Binary Search Tree),二叉排序树;
它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
数大于根肯定往根的右子树走,小于往左子树走
后序遍历:
左子->右子->根
想法(参考https://blog.csdn.net/xidiancoder/article/details/60956436)
给出的整数数组:a[n]
method(a[n])
- 为空,返回false;只有一个元素,返回true;
- root=a[n-1];
- 从0~n-2找出第一个a[i]>root(没找到,则都为左子树)
- 若i<n-1,有右子树;i>0,有左子树
- 0~i-1是左子树,method(a[i-1])
- 如果a[i]~a[n-2]都大于root,则i~n-2是右子树,method(a[n-1-1]),否则返回false(不符合之前的“大于root都在右子树”的定义)
- return 3.2&3.3
public class Solution {
public static boolean VerifySquenceOfBST(int [] sequence) {
int index;
boolean Rflag=false;
boolean Lflag=false;
int n=sequence.length;
if(n==0)
return false;
if(n==1)
return true;
int root=sequence[n-1];
index=FindIndex(sequence,root);
for(int i=index+1;i<n-1;i++) {
if(sequence[i]<root)
return false;
}
if(index<n-1) {
int lenR=n-1-index;
int[] arrR=new int[lenR];
for(int i=index,j=0;i<n-1;j++,i++) {
arrR[j]=sequence[i];
}
Rflag=VerifySquenceOfBST(arrR);
}
else
Rflag=true;
if(index>0) {
int lenL=index;
int[] arrL=new int[lenL];
for(int i=0;i<index;i++) {
arrL[i]=sequence[i];
}
Lflag=VerifySquenceOfBST(arrL);
}
else
Lflag=true;
return Lflag&&Rflag;
}
public static int FindIndex(int[] arr,int val) {
int n=arr.length;
for(int i=0;i<n-1;i++) {
if(arr[i]>val)
return i;
}
return n-2;
}
}