当前位置:网站首页>通过中序遍历和前序遍历,后续遍历来构建二叉树
通过中序遍历和前序遍历,后续遍历来构建二叉树
2022-07-17 12:13:00 【镜水灵动】
通过前序遍历和中序遍历构建二叉树
用中序遍历的根节点和第一个左节点获取做节点长度,右节点下标。
通过前序遍历(第一个节点)和后续遍历(最后一个节点)得到根节点
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/** * 通过前序遍历和中序遍历构建二叉树,前提树节点值不重复 * * @param pre 前序遍历的结果 * @param preRootNodeStart 前序遍历开始根节点下标 * @param preEnd 前序遍历集合最后一个下标 * @param inLeftNodeStart 中序遍历第一个左节点下标 * @param inPos 中序遍历值与下标映射关系 * @return */
private TreeNode buildTree(int[] pre, int preRootNodeStart, int preEnd, int inLeftNodeStart, Map<Integer, Integer> inPos) {
if (preRootNodeStart > preEnd) return null;
TreeNode root = new TreeNode(pre[preRootNodeStart]);
// 获取根节点在中序遍历的下标
int rootIdx = inPos.get(pre[preRootNodeStart]);
// 获取左子树的长度
int leftLen = rootIdx - inLeftNodeStart;
root.left = buildTree(pre, preRootNodeStart + 1, preRootNodeStart + leftLen, inLeftNodeStart, inPos);
root.right = buildTree(pre, preRootNodeStart + leftLen + 1, preEnd, rootIdx + 1, inPos);
return root;
}
public TreeNode buildTree(int[] pre, int[] in) {
Map<Integer, Integer> inPos = new HashMap<>();
for (int i = 0; i < in.length; i++) {
inPos.put(in[i], i);
}
return buildTree(pre, 0, pre.length - 1, 0, inPos);
}
private TreeNode buildTreePrePostArray(int[] post, int postStart, int postEnd, int inStart, Map<Integer, Integer> inPos) {
if (postStart > postEnd) return null;
TreeNode root = new TreeNode(post[postEnd]);
int rootIdx = inPos.get(post[postEnd]);
int leftLen = rootIdx - inStart;
root.left = buildTreePrePostArray(post, postStart, postStart + leftLen - 1, inStart, inPos);
root.right = buildTreePrePostArray(post, postStart +leftLen, postEnd - 1, rootIdx + 1, inPos);
return root;
}
// Time: O(n). Space:O(n)
public TreeNode buildTreePrePostArray(int[] in, int[] post) {
Map<Integer, Integer> inPos = new HashMap<>();
for (int i = 0; i < in.length; i++) {
inPos.put(in[i], i);
}
return buildTreePrePostArray(post, 0, post.length - 1, 0, inPos);
}
边栏推荐
- HCIA RIP实验 7.11
- 一个简单的websocket例子
- Rasa 3. X learning series -rasa version 3.1.5 release
- 什么是pytest,自动化测试必学
- How to realize the association between interfaces in JMeter?
- [200 opencv routines] 233 Moment invariants of regional features
- 押注.NET 是件好事
- R语言使用R原生函数进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics)、计算滑动分组最小值(min)并合并生成的统计数据到原数据集
- Let, const, VaR in ES6
- 【原创】Magisk+Shamiko过APP ROOT检测
猜你喜欢

HCIA 静态基础实验 7.8

Aller à l'école = gagner de l'argent? L'Académie des fées sans frais de scolarité!

Blender数字孪生制作教程

软件工程——软科中国大学专业排名

Random talk on GIS data (III)

GIS数据漫谈(三)

HCIA RIP实验 7.11

【MySQL】MySQL的增删查改(进阶)

FFmpeg录制视频、停止(VB.net,踩坑,类库——10)

Analysis of Web Remote Code Execution Vulnerability of Zhongke panyun-d module
随机推荐
【排序】归并排序
laravel 生成分表脚本示例
基于 koa2 + mysql 实现用户管理的 CRUD 代码实践
Date -- machine test topic for postgraduate entrance examination of Guizhou University
KunlunBase 线上Meetup等您来~
文件操作的底层原理(inode与软硬链接,文件的时间属性)
R语言使用lm函数构建线性回归模型、使用subset函数指定对于数据集的子集构建回归模型(使用subset函数筛选满足条件的数据子集构建回归模型)
2022 Shaanxi secondary vocational group "Cyberspace Security" - packet analysis
机械臂速成小指南(十三):关节空间轨迹规划
NJCTF 2017messager
6G空天地一体化网络高空平台基站下行频谱效率研究
C语言结构体实现简易通讯录
How to save and exit VIM
基于信道状态信息的Wi-Fi感知技术与实践
Quick completion guide of manipulator (XIII): joint space trajectory planning
中科磐云—D模块web远程代码执行漏洞解析
上學=掙錢?無需繳納學費的神仙院校!
English语法_人称代词-用法
[sort] merge sort
高效理解 FreeSql WhereDynamicFilter,深入了解设计初衷[.NET ORM]