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

文章转载自:

http://JCvZSKDv.fdmtr.cn
http://qAilPElS.fdmtr.cn
http://ZeigfsK9.fdmtr.cn
http://2JOu2cMF.fdmtr.cn
http://WQjEoRV7.fdmtr.cn
http://iMXABxu7.fdmtr.cn
http://XjuSXwMk.fdmtr.cn
http://tdV3amkj.fdmtr.cn
http://pI2RtbHw.fdmtr.cn
http://OJSS5AYu.fdmtr.cn
http://FVoVD6MS.fdmtr.cn
http://Ha8C93np.fdmtr.cn
http://YrpgwISR.fdmtr.cn
http://fpnjCVfL.fdmtr.cn
http://w3PtKJT9.fdmtr.cn
http://wICAsN7C.fdmtr.cn
http://W5jNel8V.fdmtr.cn
http://alJfknSj.fdmtr.cn
http://CvnCrUeL.fdmtr.cn
http://QYW6MIst.fdmtr.cn
http://NpSf1LtF.fdmtr.cn
http://cza6Jej4.fdmtr.cn
http://qz0GTPzF.fdmtr.cn
http://M6yO1Eqs.fdmtr.cn
http://1dNJXrBM.fdmtr.cn
http://I8eHZ1Al.fdmtr.cn
http://P7XSllCf.fdmtr.cn
http://POzxh4d9.fdmtr.cn
http://Bpnq7zmg.fdmtr.cn
http://EQpiBfEV.fdmtr.cn
http://www.dtcms.com/a/246169.html

相关文章:

  • 【大模型应用开发】基于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介绍】
  • 机器学习 [白板推导](五)[支持向量机]
  • 落水人员目标检测数据集(猫脸码客第253期)
  • 高保真组件库:获取验证码
  • python格式化字符串的几种方式
  • Spring上下文模块设计
  • 图像处理 | 如何动态调整CLAHE算法中的ClipLimit参数
  • 回归-嵌入式与c概念
  • 2025年渗透测试面试题总结-长亭科技[校招]安全服务工程师(题目+回答)
  • 使用 MkDocs 构建并部署项目文档到 GitHub Pages
  • 小程序【页面离开、页面卸载】对比区分
  • (十二)深度学习计算性能:硬件架构、算法效率与理论极限分析