因为是搜索二叉树,所以 左结点 < root < 右结点
先遍历找到 大于数组最后一个数(也就是root)的索引
则 [left,i-1]为右子树的区间,[i,right-1]为左子树的区间
判断右子树区间内的数是否都小于 root(也就是postorder[right])判断左子树区间内的数是否都大于 root
public class Offer33 {
private int[] postorder;
public boolean verifyPostorder(int[] postorder) {
this.postorder = postorder;
return helper(0,postorder.length - 1);
}
/** 创建一个方法,传入子树的左右区间,返回是否为后序遍历*/
public boolean helper(int left,int right){
/** 终止条件: 穿过叶子结点,即区间大小为0;*/
if (left >= right) return true;
/** 寻找左右子树的界限,*/
int i = left;
while (postorder[i] < postorder[right]){
i++;
}
/** 判断当前root结点的左右子树是否满足后序遍历,
* 其中左子树已经在寻找界限的时候已经满足了,所以只需要判读右子树即可*/
int j = i;
while (postorder[j] > postorder[right]){
j++;
}
Boolean flag = true;
if (j != right) flag = false;
/** 问题与子问题之间的联系:*/
return flag && helper(left,i-1) && helper(i,right-1);
}
}

这篇博客探讨了一个关于二叉搜索树的问题,即如何验证给定的后序遍历序列是否合法。文章中提供了一个名为`verifyPostorder`的方法,通过寻找左右子树的边界并检查区间内元素的关系来实现。该方法首先找到右子树的边界,然后判断右子树的所有元素是否都小于根节点,同时确保左子树的元素都大于根节点。通过递归地处理子问题,最终确定整个序列是否符合后序遍历的性质。
325

被折叠的 条评论
为什么被折叠?



