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

Posted Kapo1

tags:

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

题目

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

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

     5
    / \\
   2   6
  / \\
 1   3

示例 1:

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

示例 2:

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

提示:

数组长度 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

需要注意的地方

  1. 因为要满足后序遍历(左,右,根),所以数组的最后一个元素就是根节点
  2. 又要满足二叉搜索树,那么根节点的左子树都要比根节点小,根节点的右子树都要比根节点大,递归判断即可
  3. 可以参考这篇题解LeetCode上的题解,大佬真是太强了。。。orz

题解

class Solution 
    public boolean verifyPostorder(int[] postorder) 
        return recur(postorder, 0, postorder.length - 1);
    
    public boolean recur(int[] postorder, int i, int j) 
        if(i >= j) 
            return true;
        
        int p = i;
        // 找到根节点的左子树
        while(postorder[p] < postorder[j]) 
            p ++;
        
        int m = p;
        // 找到最后一个比根节点大的结点的下一个的索引
        while(postorder[p] > postorder[j]) 
            p ++;
        
        // 通过 p == j 确保除了左子树,根节点,其他的都是右子树即其他的都比根节点大
        // 递归左子树和右子树
        return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);
    

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

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

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

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

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

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

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