当前位置:网站首页>Leetcode刷题——构造二叉树(105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树)
Leetcode刷题——构造二叉树(105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树)
2022-08-04 11:06:00 【lonelyMangoo】
105. 从前序与中序遍历序列构造二叉树
题目:从前序与中序遍历序列构造二叉树
首先需要了解前序和中序遍历的一些概念
拿题目中的例子来说,从先序的第一个开始构造,选择3,在中序找到3,3左边的就是节点3左子树的内容,3右边的是节点3右子树的内容,所以在中序中3左边的个数就是左子树的长度,在中序中3右边的个数就是右子树的长度,这里就需要用map记下值和索引的对应关系方便查(能用map是因为无重复元素)。显然,由于先序遍历是从左边开始的,所以计算出左子树的长度,当前的下标+长度,这之前的是左子树上的,之后的是右子树上的。
下面代码:
Map<Integer, Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
map = new HashMap<>(inorder.length);
//记录中序遍历值和下标的对应关系
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
TreeNode res = build( 0, inorder.length - 1,0, preorder, inorder);
return res;
}
//有返回值,因为拼接树要用到
//方法体中的方法只在当前时刻有用,不是全局的
private TreeNode build( int leftPre, int rightPre,int leftIn, int[] preorder, int[] inorder) {
//在确定左子树之后,得到左子树的长度,超过界限的值说明没有子树了。
if(leftPre>rightPre){
return null;
}
//根节点的值
int rootVal = preorder[leftPre];
TreeNode root = new TreeNode(rootVal);
//当前节点在中序序列中的位置
int indexInOrder = map.get(rootVal);
//左子树的长度
int leftLen = indexInOrder-leftIn;
//leftPre:当前值在先序中的位置
//rightPre:当前值在先序中最大的位置
//leftIn:inorder中的左边界(用于确定长度)
//探索左子树的时候,从当前节点左边,先序中第一个开始找
root.left= build(leftPre+1, leftPre+leftLen, leftIn , preorder, inorder);
//探索右子树
root.right= build(leftPre+leftLen+1, rightPre, indexInOrder+1 , preorder, inorder);
return root;
}
106. 从中序与后序遍历序列构造二叉树
题目:106. 从中序与后序遍历序列构造二叉树
后序遍历的做法是:从最后一个开始,每次都作为根节点,但是先构造的是右子树。
其余几乎一模一样,这不过这里要设置的是右边界。
public TreeNode buildTree(int[] inorder, int[] postorder) {
Map<Integer, Integer> map = new HashMap<>(inorder.length);
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
TreeNode res = build2( 0, inorder.length - 1,inorder.length - 1, postorder, inorder, map);
return res;
}
private static TreeNode build2( int leftPre, int rightPre,int rightIn, int[] postorder, int[] inorder, Map<Integer, Integer> map) {
//在确定左子树之后,得到左子树的长度
if(leftPre>rightPre){
return null;
}
//根节点的值
int rootVal = postorder[rightPre];
TreeNode root = new TreeNode(rootVal);
//当前节点在中序序列中的位置
int indexInOrder = map.get(rootVal);
//右子树的长度
int rightLen = rightIn-indexInOrder;
//rightIn为啥是-1,因为是从右往左的
root.right= build2(rightPre-rightLen, rightPre-1, rightIn , postorder, inorder, map);
root.left= build2(leftPre, rightPre-rightLen-1, indexInOrder-1 , postorder, inorder, map);
return root;
}
边栏推荐
- Win11 file types, how to change?Win11 modify the file suffix
- helm安装
- Why are all hotel bathrooms transparent?
- *iframe*
- 小程序容器加快一体化在线政务服务平台建设
- 音频编辑 合唱
- 航企纠缠A350安全问题 空客主动取消飞机订单
- JUC (1) threads and processes, concurrency and parallelism, thread state, locks, producers and consumers
- ORB-SLAM3中的优化
- ROI LTV CPA ECPM体系讲解
猜你喜欢
数字知识库及考学一体化平台
What is the principle of thermal imaging temperature measurement?Do you know?
Redis查询缓存
《迁移学习导论》第2版,升级内容抢先看!
上帝空间——全球首个基于Web3.0的艺术协议创意平台,拓宽多元艺术融合边界
Events in August | 51CTO's 17th Anniversary Celebration, post a blog post to get gifts such as tea sets/notebooks/T-shirts!
RAID介绍及RAID5配置实例
萌宠来袭,如何让“吸猫撸狗”更有保障?
A topic of map
ROI LTV CPA ECPM体系讲解
随机推荐
【励志】复盘的重要性
Four ways to traverse a Map
深度学习100例 —— 卷积神经网络(CNN)天气识别
[easyUI]修改datagrid表格中的值
Why are all hotel bathrooms transparent?
在 .NET MAUI 中如何更好地自定义控件
Difference between ArrayList and LinkedList
2万字50张图玩转Flink面试体系
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三
知网网站地址更换
shell变量
标准C语言学习总结12
Apache Calcite 框架原理入门和生产应用
cubemx stm32 afm3000模块 气体流量传感器 驱动代码
MATLAB程序设计与应用 3.2 矩阵变换
图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)
MySQL不提供数组,只能做成表吗?
cubemx stm32 afm3000 module gas flow sensor driver code
章节小测一
美摄问答室|美映 VS 美摄云剪辑