题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
编程思路
在后序遍历得到的序列中,最后一个数字是树的根节点的值,数组中前面的数字可以分为两部分,第一部分是左子树结点的值,他们都比根节点的值小,第二部分是右子树结点的值,他们都比根节点的值大。因此,对于给定数组,先找到最后一个数作为根节点,然后从前往后按照与最后一个数比较大小看是否可以将数组分为左右子树两部分,若可以,则对左右子树递归使用这样的方法,若不可以,则该数组就不是后序遍历的结果。
程序代码(Java语言)
public class Solution {
public boolean VerifySquenceOfBST(int[] sequence) {
if(sequence == null || sequence.length <= 0)
return false;
return VerifySquenceOfBST(sequence,0,sequence.length-1);
}
public boolean VerifySquenceOfBST(int[] seq,int start,int end) {
if(start > end)
return true;
int root = seq[end];
//在二叉搜索树中左子树的结点小于根节点
int i = start;
while(i < end) {
if(seq[i] > root)
break;
i++;
}
//右子树的结点大于根节点
int j=i;
while(j < end) {
if(seq[j] < root)
return false;
j++;
}
//判断左子树是不是二叉搜索树
boolean left = true;
if(i > 0) {
left = VerifySquenceOfBST(seq,start,i-1);
}
//判断右子树是不是二叉搜索树
boolean right = true;
if(i<end)
right = VerifySquenceOfBST(seq,i,end-1);
return(left && right);
}
}