输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同
解题思路
后序遍历的最后一个节点是根节点, 从头到尾扫描序列、
借助搜索树的特性
比较与根节点的大小, 如果满足后序遍历, 则可以将除根节点之外的元素分成两部分
一部分为左子树, 另一部分右子树
然后再分别判断左子树和右子树满不满足后序遍历
代码
class Solution {
public boolean verifyPostorder(int[] postorder) {
return verifyPostorder(postorder, 0 , postorder.length - 1);
}
public boolean verifyPostorder(int[] postorder, int start, int end) {
// 当前子树只剩一个节点
if (start >= end) {
return true;
}
// i索引用来划出左子树的范围
int i = start;
// 当遍历到第一个比根节点大的就停下
while (postorder[i] < postorder[end]) {
i++;
}
// j索引用来划出右子树的范围(从左子树往右)
int j = i;
// 理想情况下遇到根节点才停下
while (postorder[j] > postorder[end]) {
j++;
}
// 所以当 j == end 时当前根节点暂时满足后序遍历, 然后递归判断左右子树是否满足后序遍历
return j == end && verifyPostorder(postorder, start, i - 1) && verifyPostorder(postorder, i, end - 1);
}
}