题目描述:
输入一个
非空整数数组
,判断该数组是不是某
二叉搜索树的后序遍历的结果
。如果是则输出
Yes,
否则输出
No
。假设输 入的数组的任意两个数字都互不相同。
二叉搜索树:左子树一定小于根结点,右子树一定大于根节点,所有的子树也满足这样的条件
例如:
思路:①对于合法的序列,二叉搜索树的后续遍历的最后一个节点是根结点
②如果去掉最后一个结点,可以把序列分成2部分,前一部分(左子树)小于根结点,后一部分(右子树)大于根结点
③由于每次子树都要满足,所以左右子树都需要递归求解。
代码实现:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0){
return false;
}
return VerifySquenceOfBSTHelper(sequence,0,sequence.length-1);
}
public boolean VerifySquenceOfBSTHelper(int [] sequence,int start,int end){
//因为要划分区间 所以需要 start 和end
if(start >= end){//递归出口的设置
return true;
}
//区域的划分
int root = sequence[end];//序列最后一个数
int i = start;
while(i < end && sequence[i] < root ){
i++;
}
//条件的检测
for(int j = i ; j < end;j++){
if(sequence[j] < root){
return false;
}
}
//左右子树都要满足条件
//i位置是左子树的根结点,所以 i-1
return VerifySquenceOfBSTHelper(sequence,start,i-1) && VerifySquenceOfBSTHelper(sequence,i,end-1);
}
}