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

这篇具有很好参考价值的文章主要介绍了剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 1. 题目
  • 2. 解题思路
  • 3. 数据类型功能函数总结
  • 4. java代码
  • 5. 踩坑小记
    • 递归调用,显示StackOverflowError

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就会导致后序遍历一直停留在和根节点的比较上,无法退出循环,导致栈溢出。文章来源地址https://www.toymoban.com/news/detail-421837.html

到了这里,关于剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包