noaman_wgs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
//输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 
//
//
//
// 参考以下这颗二叉搜索树:
//
// 5
// / \
// 2 6
// / \
// 1 3
//
// 示例 1:
//
// 输入: [1,6,3,2,5]
//输出: false
//
// 示例 2:
//
// 输入: [1,3,2,6,5]
//输出: true
//
//
//
// 提示:
//
//
// 数组长度 <= 1000
//
// 👍 209 👎 0

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        if (postorder == null) {
            return false;
        }

        return doCheck(postorder, 0, postorder.length - 1);
    }

    private boolean doCheck(int[] postOrder, int start, int end) {
        if (start >= end) {
            return true;
        }
        int rootVal = postOrder[end];
        // leftEnd实际为右子树开始位置
        int leftEnd = start;
        for (; postOrder[leftEnd] < rootVal && leftEnd < end;) {
            if (postOrder[leftEnd] < rootVal) {
                leftEnd++;
            }
        }

        // 右子树
        for (int i = leftEnd; i < end; i++) {
            if (postOrder[i] <= rootVal) {
                return false;
            }
        }

        return doCheck(postOrder, start, leftEnd - 1)
                && doCheck(postOrder, leftEnd, end - 1);

    }

}

 

posted on 2021-03-14 11:00  noaman_wgs  阅读(21)  评论(0编辑  收藏  举报