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

java根据前、中序遍历结果重新生成二叉树

1、首先写一个类表示二叉树

public class TreeNode {int num;TreeNode left;TreeNode right;public TreeNode(int num) {this.num = num;}}

2、根据前,中序遍历,在控制台我们可以得到两个结果pre 和 in:

 /*** 前序遍历* @param node*/public static void PreTree(TreeNode node){if (node == null){return;}System.out.println(node.val);PreTree(node.left);PreTree(node.right);}/*** 中序遍历* @param node*/public static void MidTree(TreeNode node){if (node == null){return;}PreTree(node.left);System.out.println(node.val);PreTree(node.right);}public static void main(String[] args) {TreeNode head = new TreeNode(1);head.left = new TreeNode(2);head.right = new TreeNode(3);head.left.left = new TreeNode(4);head.left.right = new TreeNode(5);int[] pre = {1, 2, 4, 5, 3};int[] in = {2, 4, 5, 1, 3};}

3、接下来编写构建二叉树的方法:

/*** 根据先序和中序遍历结果建出一颗树* 先序结果是:pre[L1...R1], 中序结果是[L2...R2]*/public static TreeNode buildTreeNode(int[] pre, int[] in){if (pre == null || in == null || pre.length != in.length){return null;}return f(pre, 0, pre.length-1, in, 0, in.length-1);}/*** int[] pre = {1, 2, 4, 5, 3};* int[] in = {2, 4, 5, 1, 3};*/public static TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2){if (L1 > R1){return null;}// 根节点等于前序遍历的第一个数TreeNode head = new TreeNode(pre[L1]);if (L1 == R1){return head;}int find = L2;while (in[find] != pre[L1]){find++;}head.left  = f(pre,L1 + 1, L1 + find - L2, in, L2, find - 1);head.right = f(pre, L1 + find - L2 + 1, R1, in, find+1, R2);return head;}

4、由于上面使用了while循环遍历,该方法还可以进一步优化为:

/*** 根据先序和中序遍历结果建出一颗树* 先序结果是:pre[L1...R1], 中序结果是[L2...R2]*/public static TreeNode buildTreeNode1(int[] pre, int[] in){if (pre == null || in == null || pre.length != in.length){return null;}HashMap<Integer, Integer> valueIndexMap = new HashMap<>();for (int i = 0; i < in.length; i++) {valueIndexMap.put(in[i], i);}return g(pre, 0, pre.length-1, in, 0, in.length-1, valueIndexMap);}public static TreeNode g(int[] pre, int L1, int R1, int[] in, int L2, int R2, HashMap<Integer, Integer> valueIndexMap){if (L1 > R1){return null;}TreeNode head = new TreeNode(pre[L1]);if (L1 == R1){return head;}int find = valueIndexMap.get(pre[L1]);head.left  = g(pre,L1 + 1, L1 + find - L2, in, L2, find - 1, valueIndexMap);head.right = g(pre, L1 + find - L2 + 1, R1, in, find+1, R2, valueIndexMap);return head;}

http://www.lryc.cn/news/227600.html

相关文章:

  • 利用检测结果实现半自动标注
  • Android修行手册 - 万字梳理JNI开发正确技巧和错误缺陷
  • C++学习 --类和对象之继承
  • Redis之缓存
  • Redis6的IO多线程分析
  • kali linux安装教程
  • React进阶之路(四)-- React-router-v6、Mobx
  • 55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
  • Codeforces Round 908 (Div. 2)视频详解
  • 电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计
  • Linux系统编程——实现cp指令(应用)
  • 20231112_DNS详解
  • 使用ssh上传数据到阿里云ESC云服务上
  • 【408】计算机学科专业基础 - 数据结构
  • SpringSpringBoot自动装配
  • k8s 部署mqtt —— 筑梦之路
  • 模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)
  • C++模板元模板(异类词典与policy模板)- - - 题目答案
  • 二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
  • postgresql|数据库|提升查询性能的物化视图解析
  • Unity中Shader雾效的原理
  • chatgpt辅助论文优化表达
  • Vue3 源码解读系列(二)——初始化应用实例
  • 网络原理-UDP/TCP详解
  • C#多线程入门概念及技巧
  • c primer plus_chapter_four——字符串和格式化输入/输出
  • Python Fastapi+Vue+JWT实现注册、登录、状态续签【登录保持】
  • oracle-sql语句解析类型
  • 2023 年最新企业微信官方会话机器人开发详细教程(更新中)
  • 3、FFmpeg基础