题目描述
分析
这题的关键是对树进行划分,明确后序遍历的特点,后序遍历的结果得到的序列一般是左子树的序列+右子树的序列+当前节点,它们之间存在大小关系,左子树小于根节点,右子树大于根节点。判断是否为后序遍历结果需要使用递归判断,因此这里加一个方法,参数需要包括原序列和起始点及终止点。根据输入,先找到从左至右第一个大于根节点(序列的最后一个值)的数的位置,然后保存这个位置令某个指针右移,如果途经的值都大于根节点值,则正确,根据之前保存的指针继续下一轮递归。递归的结果是通过左右子树判断结果的&&向上传递的。
特殊情况处理:输入数组长度为0,返回false。
末尾处理:start >= end的情况下,表示指针移动结束,返回true。
代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence.length == 0) {
return false;
}
return VerifySquenceOfBST(sequence, 0, sequence.length -1);
}
public boolean VerifySquenceOfBST(int [] sequence,int start, int end) {
if (start >= end) {
return true;
}
int i = start;
while (sequence[i] < sequence[end]) {
i++;
}
int j = i;
while (j < end) {
if (sequence[j] < sequence[end]) {
return false;
}
j++;
}
return VerifySquenceOfBST(sequence, start, i-1) && VerifySquenceOfBST(sequence, i, end-1);
}
}