剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治相关的知识,希望对你有一定的参考价值。

一、题目描述

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

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

     5
    / \\
   2   6
  / \\
 1   3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true

二、解题

递归分治

二叉搜索树的后序遍历:最后一个值是根节点,根节点的左子树的值是小于根节点的值,右子树是大于根节点的值,所以使用递归分治算法,从左往右找到第一个大于根节点的值,分割为左右两个子树。分割点为cur,[left,cur-1]小于根节点,[cur,right-1]大于根节点,只需要判断[cur,right-1]是否大于根节点。

class Solution 
    public boolean verifyPostorder(int[] postorder) 
        if(postorder == null)
            return true;
        
        return verifyTree(postorder,0,postorder.length-1);
    
    //二叉搜索树 递归分治 找到第一个大于根节点的下标 分割为左右子树
    public boolean verifyTree(int[] postorder,int left,int right)
        if(left >= right)
            return true;
        
        //从左往右找第一个大于根节点的值
        int cur = left;
        while(postorder[cur] < postorder[right])
            cur++;
        
        //此时cur 下标就是分割点
        //如果是正确的二叉搜索树的后序遍历,则[left,cur-1]小于根节点,[cur,right-1]大于根节点
        //判断[cur,right-1]是否大于根节点
        for(int i = cur;i<right;i++)
            if(postorder[i] < postorder[right])
                return false;
            
        
        return verifyTree(postorder,left,cur-1) && verifyTree(postorder,cur,right-1);
    


时间复杂度:O(N^2)

空间复杂度:O(N)。

以上是关于剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(33) 二叉搜索树的后序遍历序列

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

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

剑指 Offer 33. 二叉搜索树的后序遍历序列(递归,二叉搜索树,后序遍历,Java)

剑指 Offer 33. 二叉搜索树的后序遍历序列(递归,二叉搜索树,后序遍历,Java)

剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治