剑指offer33:二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
剑指offer33:二叉搜索树的后序遍历序列_第1张图片
思路:对后序遍历的数组,定义两个起始区间:start、end。进行递归操作,中止条件为:start>=end.
1.划分左右子树:
从左到右,找出第一个比根节点大的节点,索记录下来,假设为m
2.判断左右子树是不是二叉搜索树,由于1可知,左子树肯定都比根节点小,因此只需要判断右子树,即【m,end-1】如果出现比根节点大的,则返回false。

class Solution{
    public boolean verifyPostorder(int [] postorder) {
        if (postorder.length <= 2) return true;
        return verifySeq(postorder, 0, postorder.length-1);
    }
    private boolean verifySeq(int[] postorder, int start, int end) {
        if (start >= end) return true;
        int i;
        for ( i = start; i < end; i++) {
            if (postorder[i] > postorder[end]) 
            break;
        }
        // 验证后面的是否都大于sequence[end]
        for (int j = i; j < end; j++) {
            if (postorder[j] < postorder[end]) return false;
        }
        return verifySeq(postorder, start, i-1) && verifySeq(postorder, i, end-1);
    }
}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------出问题的代码:

class Solution {
    public boolean verifyPostorder(int [] postorder) {
        if (postorder.length <= 2) return true;
        return verifySeq(postorder, 0, postorder.length-1);
    }
    private boolean verifySeq(int[] postorder, int start, int end) {
        if (start >= end) return true;
        int m = start;
        //int i;
        for ( int  i = start; i < end; i++) {
            if (postorder[i] > postorder[end]){
                m = i;
                break;
            }
        }
        for (int j = m; j < end; j++) {
            if (postorder[j] < postorder[end]) return false;
        }
        return verifySeq(postorder, start, m-1) && verifySeq(postorder, m, end-1);
    }
}

你可能感兴趣的:(数据结构与算法)