1、二叉搜索树的后序遍历序列
来源:牛客网
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2、思路:后续遍历中,最后一个元素为根节点,小于根节点的元素在左子树,大于根节点的在右子树。
3、代码:
public boolean VerifySquenceOfBST(int [] sequence) {
int start = 0, end = sequence.length - 1;
if(end == -1)
return false;
boolean isOrder = verifySquenceOfBST(sequence, start, end);
return isOrder;
}
private boolean verifySquenceOfBST(int[] sequence, int start, int end) {
boolean isOrder = true;
int i, pos = end;
int root_val = sequence[end];
//找到分界点,pos为右子树的起点
for(i = start; i < end; i++){
if(sequence[i] > root_val){
pos = i;
break;
}
}
//遍历右子树,需要右子树每一个阶段都大于root_val才满足要求
for(i = pos; i < end; i++){
if(sequence[i] < root_val)
isOrder = false;
}
boolean isLeftOrder = true, isRightOrder = true;
if(isOrder){
if(pos - start > 1){ //左子树的节点数大于1
isLeftOrder = verifySquenceOfBST(sequence, start, pos - 1);
}
if(end - pos > 1){ //右子树结点数大于1
isRightOrder = verifySquenceOfBST(sequence, pos, end - 1);
}
}
return isOrder && isLeftOrder && isRightOrder;
}