当前位置: 首页 > news >正文

Day15:二叉树的后续遍历序列

请实现一个函数来判断整数数组 postorder 是否为二叉搜索树的后序遍历结果。

示例 1:

输入: postorder = [4,9,6,5,8]
输出: false 
解释:从上图可以看出这不是一颗二叉搜索树

LCR 152. 验证二叉搜索树的后序遍历序列 - 力扣(LeetCode)

class Solution {
    public boolean verifyTreeOrder(int[] postorder) {
        if(postorder == null || postorder.length == 0 || postorder.length == 1){
            return true;
        }

        int length = postorder.length - 1;
        int root = postorder[length];

        int index = 0;
        //遍历出左子树节点
        for(int i = 0; i < length; i++){
            if(postorder[i] > root){
                index = i;
                break;
            }
        }
        if (index == 0 && postorder[index] < root) {
            index = length; // 右子树为空
        }
        //从这开始都应该是比根大了
        for(int j = index; j <length; j++ ){
            if(postorder[j] < root)
                 return false;
        }

         // 处理左子树
        int[] left = new int[0]; // 默认左子树为空
        if (index > 0) {
            left = Arrays.copyOfRange(postorder, 0, index);
        } 
        // 处理右子树
        int[] right = new int[0]; // 默认右子树为空
        if (index < length) {
            right = Arrays.copyOfRange(postorder, index, length);
        } 
        return verifyTreeOrder(left)&&verifyTreeOrder(right);
    }
}

要注意函数调用的边界。Arrays.copyOfRange(postorder, 0, index) 是复制从索引 0 到 index - 1 的元素,而不是复制到 index。在这里栽坑了。然后就是右子树为空的情况,因为没有比他大的元素,所以index不会变,deepseek让我加一个判断,我觉得应该是我代码本身的纰漏。选择把index的更新放在判断体的外面就行了(基本功不好)

 

class Solution {
    public boolean verifyTreeOrder(int[] postorder) {
        if(postorder == null || postorder.length == 0 || postorder.length == 1){
            return true;
        }

        int length = postorder.length - 1;
        int root = postorder[length];

        int index = 0;
        //遍历出左子树节点
        for(; index < length; index++){
            if(postorder[index] > root){
                break;
            }
        }

        for(int j = index; j <length; j++ ){
            if(postorder[j] < root)
                 return false;
        }

         // 处理左子树
        int[] left = new int[0]; // 默认左子树为空
        if (index > 0) {
            left = Arrays.copyOfRange(postorder, 0, index);
        } 
        // 处理右子树
        int[] right = new int[0]; // 默认右子树为空
        if (index < length) {
            right = Arrays.copyOfRange(postorder, index, length);
        } 
        return verifyTreeOrder(left)&&verifyTreeOrder(right);
    }
}

相关文章:

  • DeepSeek刷力扣辅助题单 存留记录
  • C++中的const与类型转换艺术
  • Json 转义符号处理(Mongo changeStream op log)
  • SAP访问外围系统(http/https)
  • Android笔记:Android平台下SVG格式的解析与实践
  • ardunio R4 WiFi连接实战
  • 《Transformer如何进行图像分类:从新手到入门》
  • 人工智能基础知识笔记四:聚类分析
  • HOT100——二叉树篇Leetcode236. 二叉树的最近公共祖先
  • 【H2O2 | 软件开发】Axios发送Http请求
  • 队列的简单例题
  • cyberstrikelab lab2
  • 星越L_发动机舱开启及油液加注讲解
  • sqldef:一款免费的数据库变更管理工具
  • 基于llama_cpp 调用本地模型(llama)实现基本推理
  • Redis三大件 穿透、雪崩、击穿
  • 蓝桥杯进制问题秒破解法|冲击省一题单(二)
  • Spring 注解解析
  • 如何实现具备自动重连与心跳检测的WebSocket客户端
  • lambda表达式案例分析
  • 哈尔滨网络科技公司做网站/台州seo快速排名
  • wordpress 优酷插件/昆明seo博客
  • 蔬菜基地做网站合适吗/搜索引擎优化课程
  • 手机下载视频网站模板下载/软文营销经典案例
  • 网站关闭备案/网页设计师
  • 外贸商城网站制作/seo优化的方法