当前位置: 首页 > 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;
    }
}

相关文章:

  • 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_超详细,包含代码讲解和原理图
  • 中美贸易代表会谈后是否已确定下一次会谈?外交部回应
  • 浙江理工大学传播系原系主任刘曦逝世,年仅44岁
  • 从良渚到三星堆:一江水串起了5000年的文明对话
  • 新城市志|GDP万亿城市,一季度如何挑大梁
  • 孟夏韵评《无序的学科》丨误读与重构的文化漂流
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:没太多包袱,很多事都能从零开始