二叉搜索树的后序遍历序列(剑指offer)
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解法:二叉搜索树就是左子树所有节点小于根节点,所有右子树大于根节点,而后续遍历则又是左右中(故数组一段全小于最后一个,后一段全大于),故数组最后一个数字是根节点。所以进行循环,找到第一个大于该根节点的节点,再在该节点后面循环判断如果有小于根节点的则一定不满足,如果后一段也全都大于根节点,则获取这两段为一个新的子树的后序遍历的数组,递归判读。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0){
return false;
}
int length = sequence.length;
int leftlength = 0; //左子树数组长度
int rightlength = 0; //右子树数组长度
boolean leftresult = true;
boolean rightresult = true;
//找到第一个大于的
for(;leftlength<length-1;leftlength++){
if(sequence[leftlength]>sequence[length-1]){
break;
}
}
//判断后一段是否满足全大于根节点
for(int j=leftlength;j<length-1;j++){
if(sequence[j]<sequence[length-1]){
return false;
}
}
//生成子树的数组 递归判断
int[] leftarray = new int[leftlength];
for(int i=0;i<leftlength;i++){
leftarray[i] = sequence[i];
}
//一定要加判断,要不递归到最后没有节点,会因为最开始的判断起始数组为空的语句返回false
if(leftarray.length>0){
leftresult = VerifySquenceOfBST(leftarray);
}
rightlength = length-leftlength-1;
int[] rightarray = new int[rightlength];
for(int i=0;i<rightlength;i++){
rightarray[i] = sequence[leftlength+i];
}
if(rightarray.length>0){
rightresult = VerifySquenceOfBST(rightarray);
}
return leftresult&rightresult;
}
}
本文介绍了一种判断整数数组是否为二叉搜索树后序遍历的有效方法。通过分析数组特征,利用递归算法确定其是否符合二叉搜索树的遍历规则。
1万+

被折叠的 条评论
为什么被折叠?



