题目:二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
在后续遍历得到的序列中,最后一个数字是树的根节点的值。
数组中前面的数字可以分为两部分:
第一部分是左子树节点的值,他们逗比根结底的值小;
第二部分是右子树节点的值,他们都不根节点的值大。
代码实现:
public class Solution {
public boolean VerifySquenceOfBST(int[] sequence) {
//代码的鲁棒性分析
if (sequence == null || sequence.length < 1) {
return false;
}
return VerifySquenceOfBST(sequence, 0, sequence.length - 1);
}
private boolean VerifySquenceOfBST(int[] sequence, int start, int end) {
//循环结束的标志
if (start >= end) {
return true;
}
// 最后一个节点为根节点
int root = sequence[end];
// 找到根节点的左节点
int i = start;
for (; i < end; i++) {
if (sequence[i] > root) {
break;
}
}
// 判断根节点的右节点是否都是大于根节点的
//由于最后一个节点是根节点,所以j < end
for (int j = i; j < end; j++) {
// 如果 右节点中的节点有小于节点的,返回false;
if (sequence[j] < root) {
return false;
}
}
// 否则输出循环调用,直到start>=end,循环结束退出
//判断左子树
boolean left = VerifySquenceOfBST(sequence, start, i - 1);
//判断右子树
boolean right = VerifySquenceOfBST(sequence, i, end - 1);
return (left && right);
}
}