题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
参考思路
首先二叉搜索树的特点是所有的左子树的值比根节点值小(存在左子树的前提下),所有右子树的值比根节点的值大(存在右子树的前提下)。此外,二叉树的后续遍历顺序为先左子树,然后右子树,最后根节点。因此可以得出一个二叉搜索树的后续遍历最后一个数是根节点,然后依次划分数组进行递归,直到所有的子树都满足搜索二叉树的条件即返回。
参考代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0) {
return false;
}
return isBfsBack(sequence, 0, sequence.length-1);
}
public static boolean isBfsBack(int[] sequence ,int start,int end) {
//说明所有的子树都已经找完,返回true
if(start >= end) {
return true;
}
int root = sequence[end];
int splitKey = start;
int tmpKey = start;
for (int i = start; i <= end; i++) {
if(sequence[i] > root) {
for (int j = i; j < end; j++) {
if(sequence[j] < root) {
return false;
}
}
splitKey = i;
}
}
return isBfsBack(sequence, start, splitKey-1) && isBfsBack(sequence, splitKey, end-1);
}
}
此外还有一个简单的方法,仅供参考。
思路跟上面一致,知识用了取巧的方法,遍历每一个子数组,都需要满足搜索二叉树的后序遍历。
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0){
return false;
}
int sum = sequence.size()-1;
int count = 0;
while(sum){
while(sequence[count] < sequence[sum]){
++count;
}
while(sequence[count] > sequence[sum]){
++count;
}
if(count < sum){
return false;
}
--sum;
count = 0;
}
return true;
}