使用递归,传递的参数为数组左右边界,右边界即为跟节点,数组前半部分值必小于跟节点所对应的值,数组后半部分值必大于根节点指。
固从后往前遍历,找到第一个小于跟节点的值,且之前的所有值均是小于根节点指的,否则就二叉搜索树的后序遍历结果。并以此为边界分割数组(既分割为左右子树)
class Solution {
public boolean verifyPostorder(int[] postorder) {
return dfs(postorder, 0, postorder.length - 1);
}
private boolean dfs(int[] postorder, int left, int right){
if(left >= right) return true;
int i = right - 1;
for(; i > left; i--){
if(postorder[i] < postorder[right]) break;
}
for(int j = left; j < i; j++)
if(postorder[j] > postorder[right]) return false;
return dfs(postorder, left, i) && dfs(postorder, i + 1, right - 1);
}
}