二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
- 后序遍历:左-->右-->根节点
- 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点
- 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列
- 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归的处理这两个子序列
代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length == 0) {
return false;
}
return verify(sequence, 0, sequence.length - 1);
}
public boolean verify(int[] data, int start, int end) {
if (data == null || data.length == 0) {
return false;
}
// 二叉搜索树中左子树的结点小于根结点
int i = start;
for (; i < end; i++) {
if (data[i] > data[end]) {
break;
}
}
// 二叉搜索树中右子树的结点大于根结点
int j = i;
for (; j < end; j++) {
if (data[j] < data[end]) {
return false;
}
}
// 判断左子树是不是二叉搜索树
boolean left = true;
if (i - start > 0) {
left = verify(data, start, i - 1);
}
// 判断右子树是不是二叉搜索树
boolean right = true;
if (i < end) {
right = verify(data, i, end - 1);
}
return (left && right);
}
}