题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
题目很简单,明确了二叉搜索树的定义就很好做了:
二叉搜索树
定义:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
- 首先判断序列长度是否为0或者为空,均返回false;
- 接着使用递归判断当前序列是否是二叉搜索树:
(1) 从序列最后一位获取root节点
(2)然后从当前序列头开始查找直到找到第一个大于root节点值的,并标记
(3)判断从该标记点一直到root节点前一个节点间(也就是右子树)有没有小于root的,有就返回false
(4)然后分别递归由标记节点分开的左右子树序列
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if(len==0 || sequence==null)
return false;
return Verification(sequence,0,len-1);
}
private boolean Verification(int []arr,int start,int end){
int root = arr[end],i = 0;
if(end-start<=1)
return true;
for(i=0;i<end;i++){
if(arr[i]>root)
break;
}
for(int j=i;j<end;j++){
if(arr[j]<root)
return false;
}
boolean left = true,right = true;
if(i>0){
left = Verification(arr,start,i-1);
}
if(i<arr.length){
right = Verification(arr,i,end-1);
}
return left && right;
}