题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
1.二叉搜索树(又称二叉查找树,或二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
2.二叉查找树的后续遍历将数组分为三段:左子树(均小于根节点)+右子树(均大于根节点)+根节点。
如:{2,4,3,6,5}为二叉搜索树的后续遍历序列,{2,4,3}均小于5,{6}大于5;而在{2,4,3}中{2}小于3,{4}大于3
{2,4,3,6,1,5}则不是二叉搜索树的后续遍历序列,因为在右子树{6,1}中1小于5
3.找出序列中的左右子树边界,然后分别对左右子树进行递归判断
public class Solution {
public boolean VerifySquenceOfBST(int[] sequence) {
if(sequence == null || sequence.length == 0)
return false;
boolean res = VerifySquenceOfBST(sequence, 0, sequence.length - 1);
return res;
}
public boolean VerifySquenceOfBST(int[] sequence, int start, int end) {
//只有一个元素时,表示满足条件,返回true
if(start == end)
return true;
int root = sequence[end];
//左子树中全部比根节点小
int i = start;
while(i < end) {
if(sequence[i] > root)
break;
i++;
}
//在右子树中查找有没有小于根节点的情况
for(int j = i; j < end; j++) {
if(sequence[j] < root)
return false;
}
//遍历左子树
boolean left = true;
if(i > start)
left = VerifySquenceOfBST(sequence, start, i-1);
//遍历右子树
boolean right = true;
if(i < end)
right = VerifySquenceOfBST(sequence, i, end-1);
return left && right;
}
}