Java版本
1.递归方法
为了解题方便,重新构造新的函数包含参数start,end,表示每次检查是否是二叉搜索树的起止位置。
思路见代码注释
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if(len==0)
return false;
return isPostOrder(sequence, 0, len-1);
}
private boolean isPostOrder(int [] sequence, int start, int end){
//在搜索树中判断左子树是否都小于根
int i = start;
for(;i<end;i++){
if(sequence[i]>sequence[end])
break;
}
//在搜索树中判断右子树是否都大于根
int j = i;
for(;j<end;j++){
if(sequence[j]<sequence[end])
return false;
}
//判断左子树是否是二叉搜索树
boolean left = true;
if(i > start)
left = isPostOrder(sequence,start,i-1);
//判断右子树是否是二叉搜索树
boolean right = true;
if(i<end)
right = isPostOrder(sequence, i, end-1);
return left && right;
}
}
2. 非递归方法
从数组的最后开始遍历,每遍历一个元素,查看当前元素之前的序列是不是二叉搜索树的后序遍历序列,如果不是,直接返回false。如果遍历到数组的首元素都满足二叉搜索树的后序遍历序列,则返回true。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if(len == 0)
return false;
while(--len>0)
{
int i = 0;
for (; i < len; ++i)
{
if (sequence[i] > sequence[len])
break;
}
for (; i < len; ++i)
{
if (sequence[i] < sequence[len])
return false;
}
}
return true;
}
}