剑指 Offer 33. 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

    5
    / \
   2   6
  / \
 1   3

  

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true  

 

 

代码和思路:

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        //首先明确一点,二叉搜索树是有序树
        if (postorder.length < 2){
            return true;
        }
        return verify(postorder, 0, postorder.length - 1);
    }
    // 递归实现
    private boolean verify(int[] postorder, int left, int right)
    {
        if (left >= right) 
        {
            return true; //当前区域不合法的时候直接返回true就好
        }
        int rootValue = postorder[right]; // 当前树的根节点的值
        int k = left;
        while (k < right && postorder[k] < rootValue)
        {
            // 从当前区域找到第一个大于跟节点的,说明后续区域树值都在右子树中
            k++;
        }
        for (int i = k; i < right; i++)
        {
            // 进行判断后续的区域是否所有的值都是大于当前的根节点,如果出现小于的值直接返回false
            if(postorder[i] < rootValue)
            {
                return false;
            }
        }
        // 当前树没问题就检查左右子树
        if (!verify(postorder, left, k-1))
        {
            return false; // 检查左子树
        }
        if (!verify(postorder, k, right - 1))
        {
            return false;  //检查右子树
        }
        return true; //最终都没问题就返回 true
    }
}

  

posted on 2021-06-23 15:16  Hebye  阅读(22)  评论(0编辑  收藏  举报

导航