题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
二叉搜索树又叫二叉排序树,它的父节点总是大于左子节点(如果左子节点不为空),总是小于右子节点(如果右子节点不为空)。且对二叉搜索树进行中序遍历,得到一个有序升序序列。
(1).基于此性质,我们可知对一个二叉搜素树进行后续遍历,则最后一个节点为根节点。
(2).根节点左边节点对应的值小于根节点,根节点右边节点对应的值大于根节点。
(3).对一个数组,若数组为某二叉搜索树的后续遍历序列,则满足数组末尾元素为二叉搜索树的根节点值。依次从小到大遍历数组,找到第一个大于末尾元素的元素,则此元素的左右两侧元素分别是根节点的左右子树对应的元素。左右子树同样满足上述规则。
(4).对一个未知数组,从下标索引为零开始,让数组中的元素与数组最后一个元素比较。依次往后遍历,直到数组中元素大于数组中最后一个元素,则认为小于此下标索引的元素为根节点的左子树,大于此下标索引的元素为根节点的右子树。
(5).把此下标索引的左和右分别看成两个数组,按照(3)的条件依次递归,直到数组中为一个元素,如果满足条件则判断为true,否则判断为false。
代码实现如下:
public class Solution {
public boolean VerifySquenceOfBST(int[] sequence){
//如果数组为空或者长度小于等于零则返回false
if(sequence==null||sequence.length<=0){
return false;
}
//传入三个参数:数组序列、数组序列开始下标索引、结束下标索引。
return VerifySquenceOfBST(sequence,0,sequence.length-1);
}
private boolean VerifySquenceOfBST(int[]sequence,int start,int end){
//判断大小下标索引是否相等,如果相等则返回true
if(start>=end){
return true;
}//把数组中的末尾元素赋值
int root = sequence[end];
//把数组中的开始元素赋值
int m = start;
//寻找数组中第一个大于末尾元素的元素下标索引,若数组是二叉搜索树的后序遍历序列,则此元素的右
//边元素都大于末尾元素。
while(sequence[m]<root){
m++;
}
int n = m;
while(n<end){
//如果数组中此元素的右边存在小于末尾元素的元素,则直接返回false
if(sequence[n]<root){
return false;
}
n++;
}
//递归判断此元素的左右元素
boolean left = VerifySquenceOfBST(sequence,start,m-1);
boolean right = VerifySquenceOfBST(sequence,n+1,end);
//返回判断结果
return left&&right;
}
}