标签:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
整数数组
布尔值
什么是二叉搜索树?
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
分析:
BST的后序遍历的合法序列满足:
对于一个序列S,最后一个元素是根元素,假设为x;
如果去掉根元素剩下的序列为T,那么T满足:前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)也是合法的后序序列。
解法一 运行时间:32ms 占用内存:503k
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null || sequence.length==0) return false;
return IsTreeOfBST(sequence,0,sequence.length-1);
}
public boolean IsTreeOfBST(int [] sequence,int start,int end){ //子数组为空
if(end<=start) return true;
int i=0;
for(;i<end;i++){//找到左右子树分割点
if(sequence[i]>sequence[end]) break;
}
for(int j=i;j<end;j++){
if(sequence[j]<sequence[end]) return false;
}
//递归
return IsTreeOfBST(sequence,0,i-1)&&IsTreeOfBST(sequence,i,end-1);
}
}
采用递归的思想,先找出根节点,左子树元素都必须比根节点小,右子树节点都比根节点大,否则返回false.
得到子树(子序列)的两种方法:
①用下标把数组 逻辑分为几个子数组(这里采用的是这种)
②用工具类Arrays把数组分割
解法二 运行时间:38ms 占用内存:654k
import java.util.Arrays;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if(sequence==null || len==0) return false;
int i=0;
for(;i<len-1;i++){//寻找左右子树分界点
if(sequence[i]>sequence[len-1]) break;
}
for(int j=i;j<len-1;j++){
if(sequence[j]<sequence[len-1]) return false;
}
boolean left=true;//左右子树标志,默认为true
boolean right=true;
if(i>0){//判断是否还有左子树
left = VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));
}
if(i<len-1){//判断是否还有右子树
right = VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,len-1));
}
return left&&right;//返回递归结果
}
}
思路还是和解法一相同,只是用工具类Arrays把数组分割,效率比解法一慢一些。
标签:
原文地址:http://blog.csdn.net/amazing7/article/details/51433832