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

从中序与后序遍历序列构造二叉树(Java)

从中序与后序遍历序列构造二叉树(Java)

大体思路:从后序数组中找到最后一个元素的值,即为当前节点并进行节点的创建,并在中序数组中找到该值所在索引(使用Map)。接着开始递归,后序数组倒着向前(所以递归应该先从右子树开始),当右子树遍历完(即不存在遍历区间时left>right)return。

问题分析

  1. 返回值:返回最终头节点;
  2. 参数:由于需要遍历区间,所以定义两个参数left、right,至于map, postorder作为全局变量使用。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer, Integer> map = new HashMap<>();
    int[] postorder;
    int postindex;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        this.postorder = postorder;
        postindex = postorder.length - 1;
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i); // 通过值找索引(而且题目中表示值不会相同)
        }
        return treeBuild(0, postindex);
    }
    public TreeNode treeBuild(int left, int right //注意这个是inorder的左右区间 ){
        if(left > right){
            return null;
        }
        int rootval = postorder[postindex--];
        TreeNode root = new TreeNode(rootval); //创建节点
        int mid = map.get(rootval); //中序的切割点
        root.right = treeBuild(mid + 1, right);
        root.left = treeBuild(left, mid - 1);
        return root;
    }
}

从前序与中序遍历序列构造二叉树(Java)

思路分析:整体思路类似上一题,只不过这次先序遍历数组中的顺序是中左右,所以根节点是在最前边,同时递归时注意先左子树后右子树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer, Integer> map = new HashMap<>();
    int[] preorder;
    int i = 0; // 记录先序数组中的中间节点的索引
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        return fucTree(0, preorder.length - 1);

    }
    public TreeNode fucTree(int left, int right){
        if(left > right){
            return null;
        }
        int rootval = preorder[i++];
        TreeNode root = new TreeNode(rootval);
        int mid = map.get(rootval);
        root.left = fucTree(left, mid - 1);
        root.right = fucTree(mid + 1, right);
        return root;
    }
}
http://www.dtcms.com/a/75395.html

相关文章:

  • Rockchip --- 图像时延优化
  • pandas中excel自定义单元格颜色
  • 3D视觉相机引导机器人的原理
  • Arduino入门常用指令详解及语法指南
  • DeepSeek在数据爬取领域的革新实践:架构解析与实战指南
  • 案例驱动的 IT 团队管理:创新与突破之路:第三章 项目攻坚:从流程优化到敏捷破局-3.2.2 Scrum vs Kanban 的场景化选择
  • DeepSeek:AI 搜索引擎的革新者?
  • Chat2DB:自然语言生成 SQL 的时代来临,数据库管理更简单
  • FPGA中级项目4——DDS实现
  • 物联网中设备与平台通信的方式
  • SENT接口
  • 如何处理和格式化日期差异:JavaScript 日期差异计算实例
  • 高项第十二章——项目质量管理
  • 关于foobar2000插件的一点理解
  • ollama 可以通过127.0.0.1访问,但是无法通过本机ip访问
  • 人工智能领域大模型、大模型使用、AI工作流 学习路径
  • Oracle ASM 磁盘组冗余策略
  • 向量数据库:AI时代的“新基建”
  • 护网面试题
  • 第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6_HAL库_CubeMX_超详细,包含代码讲解和原理图
  • 【Docker入门】构建推送第一个Docker映像
  • HCIA-PPP实验
  • 将字符串中的小写字母转换成大写字母(信息学奥赛一本通-1138)
  • unity中 添加dll 报错 DllNotFoundException
  • 【Linux编程】IPC之消息队列从踩坑到实战:核心原理、实战案例与C++封装详解(含完整代码)
  • Tomcat、Open Liberty 和 WebSphere Application Server (WAS) 的配置、调试和跟踪
  • 嵌入式开发之STM32学习笔记day07
  • PCIe(Peripheral Component Interconnect Express)详解
  • docker 命令里 --restart=unless-stopped 参数的作用
  • Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战