剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

offer,二叉,搜索,后序,遍历,序列,java,解题 · 浏览次数 : 24

小编点评

**题目2:** 判断数组是不是某二叉搜索树的后序遍历结果。 **解题思路:** 使用递归分治的思路,根据最后一个值x,划分为左右子数组;查找比x大的元素,第一个比x大的元素下标为i,在此处划分数组[start,i-1]和[i,end];检查左右数组:左数组的元素均小于x,右数组的元素均大于x。由于左数组元素和x的大小关系已经确定,只需要检查右数组和x的大小关系即可。如果右数组不符合要求,直接返回false;否则继续执行下一步对左右子数组,重复上述步骤;终止条件:数组为空或者只有一个元素,返回true **数据类型功能函数总结:** //数组int len=arrayname.length;//数组长度4 **java代码:** ```java class Solution { public boolean verifyPostorder(int[] postorder) { return recur(postorder, 0, postorder.length - 1); } public boolean recur(int[] postorder, int start, int end) { if (end - start <= 1) { return true; } int rootVal = postorder[end]; int i = start; for (int i = start; i < end; i++) { if (postorder[i] > rootVal) { break; } } //得到i,左右数组[start,i-1],[i,end-1] //检查左右数组 int flag = 0; for (int j = i; j < end & flag == 0; j++) { if (postorder[j] < rootVal) { flag = 1; } } if (flag == 0) { return recur(postorder, start, i - 1) & recur(postorder, i, end - 1); } else { return false; } } } ``` **踩坑小记:** 递归调用时,如果右数组划分的时候,传入end就会导致后序遍历一直停留在和根节点的比较上,无法退出循环,导致栈溢出。归纳总结以上内容,生成内容时需要带简单的排版。

正文

1. 题目

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

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

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

提示:

数组长度 <= 1000

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/5vwxx5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2. 解题思路

使用递归分治的思路:

  • 根据最后一个值x,划分为左右子数组;
    • 查找比x大的元素,第一个比x大的元素下标为i,在此处划分数组[start,i-1][i,end]
  • 检查左右数组:左数组的元素均小于x,右数组的元素均大于x
    • 由于左数组元素和x的大小关系已经确定,只需要检查右数组和x的大小关系即可。
    • 如果右数组不符合要求,直接返回false;否则继续执行下一步
  • 对左右子数组,重复上述步骤;

终止条件:数组为空或者只有一个元素,返回true

3. 数据类型功能函数总结

//数组
int len=arrayname.length;//数组长度

4. java代码

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder,0,postorder.length-1);
    }
    public boolean recur(int[] postorder,int start,int end){
        if(end-start<=1){
            return true;
        }
        else{
            int root_val=postorder[end];
            int i=start;
            for(i=start;i<end;i++){
                if(postorder[i]>root_val){
                    break;
                }
            }
            //得到i,左右数组[start,i-1],[i,end-1]
            //检查左右数组
            int flag=0;
            for(int j=i;j<end && flag==0;j++){
                if(postorder[j]<root_val){
                    flag=1;
                }
            }
            if(flag==0){
                return  recur(postorder,start,i-1)&&recur(postorder,i,end-1);
            }
            else{
                return false;
            }

        }
    }
}

5. 踩坑小记

递归调用,显示StackOverflowError

递归函数的部分为:

if(flag==0){
    return  recur(postorder,start,i-1)&&recur(postorder,i,end-1);
}

而我一开始写成了:

if(flag==0){
    return  recur(postorder,start,i-1)&&recur(postorder,i,end);
}

然后一直报错显示StackOverflowError,后来发现是右数组划分的时候,传入end就会导致后序遍历一直停留在和根节点的比较上,无法退出循环,导致栈溢出。

与剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)相似的内容:

剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

leetcode《图解数据结构》剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指Offer 05. 替换空格(java解题)

leetcode中《图解数据结构》的刷题记录,包含解题思路、java代码的知识点小结和遇到的一些错误类型,与君共勉。

剑指 Offer 32 - I. 从上到下打印二叉树(java解题)

leetcode《图解数据结构》剑指 Offer 32 - I. 从上到下打印二叉树的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

leetcode《图解数据结构》剑指 Offer 32 - II. 从上到下打印二叉树II 的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)

leetcode《图解数据结构》剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 34. 二叉树中和为某一值的路径(java解题)

leetcode《图解数据结构》剑指 Offer 34. 二叉树中和为某一值的路径(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 55 - I. 二叉树的深度(java解题)

leetcode《图解数据结构》剑指 Offer 55 - I. 二叉树的深度(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 55 - II. 平衡二叉树(java解题)

leetcode《图解数据结构》剑指 Offer 55 - II. 平衡二叉树(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 64. 求 1 + 2 + … + n(java解题)

leetcode《图解数据结构》剑指 Offer 64. 求 1 + 2 + … + n(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(java解题)

leetcode《图解数据结构》剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。