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

leetcode 从中序与后序序列 or 从前序与中序序列 构造二叉树 java

  1. 前序pre:root、left、right
  2. 中序in:left、root、right
  3. 后序post:left、right、root

算法过程

  1. 构造HashMap,将inorder存储在map中
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置map.put(inorder[i], i);}
  1. 构造findNode函数
    中序与后序序列:findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd)
    前序与后序序列:findNode(int[] preorder, int preBegin, int preEnd, int[] inorder, int inBegin, int inEnd)

2.1 判断有没有元素,没有的话返回null
2.2 找到前序遍历的第一个元素or 后序遍历的最后一个元素在中序遍历中的位置

int rootIndex = map.get(preorder[preBegin]);
int rootIndex = map.get(postorder[postEnd-1]);

2.3 构造root节点

TreeNode  root = new TreeNode(inorder[rootIndex]);

2.4 保存中序左子树个数,用来确定后序数列的个数

int lenOfLeft = rootIndex-inBegin;

2.5 创建root.left和root.right
中序与后序序列:

root.left = findNode(inorder, inBegin, rootIndex, postorder, postBegin, postBegin+lenOfLeft);
root.right = findNode(inorder,rootIndex+1,inEnd, postorder, postBegin+lenOfLeft,postEnd-1);

前序与中序序列:

root.left = findNode(preorder,preBegin+1,preBegin+lenOfLeft+1,inorder,inBegin,rootIndex);
root.right= findNode(preorder,preBegin+lenOfLeft+1,preEnd,inorder,rootIndex+1,inEnd);

2.6 return root;

完整代码:

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

class Solution {Map<Integer, Integer> map;  // 方便根据数值查找位置public TreeNode buildTree(int[] inorder, int[] postorder) {map = new HashMap<>();for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置map.put(inorder[i], i);}return findNode(inorder,  0, inorder.length, postorder,0, postorder.length);  // 前闭后开}public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {// 参数里的范围都是前闭后开if (inBegin >= inEnd || postBegin >= postEnd) {  // 不满足左闭右开,说明没有元素,返回空树return null;}int rootIndex = map.get(postorder[postEnd - 1]);  // 找到后序遍历的最后一个元素在中序遍历中的位置TreeNode root = new TreeNode(inorder[rootIndex]);  // 构造结点int lenOfLeft = rootIndex - inBegin;  // 保存中序左子树个数,用来确定后序数列的个数root.left = findNode(inorder, inBegin, rootIndex,postorder, postBegin, postBegin + lenOfLeft);root.right = findNode(inorder, rootIndex + 1, inEnd,postorder, postBegin + lenOfLeft, postEnd - 1);return root;}
}

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

class Solution {Map<Integer, Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {map = new HashMap<>();for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置map.put(inorder[i], i);}return findNode(preorder, 0, preorder.length, inorder,  0, inorder.length);  // 前闭后开}public TreeNode findNode(int[] preorder, int preBegin, int preEnd, int[] inorder, int inBegin, int inEnd) {// 参数里的范围都是前闭后开if (preBegin >= preEnd || inBegin >= inEnd) {  // 不满足左闭右开,说明没有元素,返回空树return null;}int rootIndex = map.get(preorder[preBegin]);  // 找到前序遍历的第一个元素在中序遍历中的位置TreeNode root = new TreeNode(inorder[rootIndex]);  // 构造结点int lenOfLeft = rootIndex - inBegin;  // 保存中序左子树个数,用来确定前序数列的个数root.left = findNode(preorder, preBegin + 1, preBegin + lenOfLeft + 1,inorder, inBegin, rootIndex);root.right = findNode(preorder, preBegin + lenOfLeft + 1, preEnd,inorder, rootIndex + 1, inEnd);return root;}

相关文章:

  • 【大模型应用开发】基于langchain的大模型调用及简单RAG应用构建
  • MATLAB griddatan 函数支持的插值方法MATLAB 的 griddatan 函数主要支持以下几种插值方法
  • 【系统时间不同步】
  • P10987 [蓝桥杯 2023 国 Python A] 火车运输
  • 芯片制程变化
  • 主流邻近标记技术解析与应用
  • ARM 和 x86_64是什么关系
  • Oracle Form判断表单数据重复方法
  • 用idea进行数据同步
  • 大中台应用的层次抽象
  • cf1742D
  • VSCode - Trae 插件关闭弹出框代码补全
  • 微服务集成seata分布式事务 at模式快速验证
  • 【Java工程师面试全攻略】Day8:高并发系统设计实战
  • R语言缓释制剂QBD解决方案之四
  • 2025pmx文件怎么打开blender和虚幻
  • Vosk API:开源离线语音识别的强大工具
  • 超简单部署离线语音合成TTS和语音识别
  • 【android bluetooth 框架分析 04】【bt-framework 层详解 5】【AbstractionLayer介绍】
  • 机器学习 [白板推导](五)[支持向量机]
  • 沈阳建设工程信息网 采购甲方都在中项网/济南seo培训
  • 八大美院视觉传达设计作品/seo服务外包报价
  • 企业网站开发市场/济南seo优化公司助力网站腾飞
  • 021新手学做网站/如何在各大网站发布信息
  • 动力网站建设/新平台推广
  • 有没有交流做服装的网站/站长统计入口