当前位置:网站首页>Leetcode brush - structure binary tree (105. Once upon a time sequence and the sequence structure binary tree traversal sequence, 106. From the sequence with the sequence structure binary tree travers
Leetcode brush - structure binary tree (105. Once upon a time sequence and the sequence structure binary tree traversal sequence, 106. From the sequence with the sequence structure binary tree travers
2022-08-04 11:14:00 【lonelyMangoo】
105. 从前序与中序遍历序列构造二叉树
题目:从前序与中序遍历序列构造二叉树
First of all, you need to understand some concepts of preorder and inorder traversal
Take the example in the title,Construct from the first one in the preorder,选择3,Found in midorder3,3The left one is the node3The contents of the left subtree,3On the right is the node3The contents of the right subtree,So in the middle sequence3The number on the left is the length of the left subtree,在中序中3The number on the right is the length of the right subtree,这里就需要用mapWrite down the correspondence between the value and the index for easy checking(能用mapbecause there are no repeating elements).显然,Since preorder traversal starts from the left,So calculate the length of the left subtree,当前的下标+长度,The one before this is on the left subtree,The ones after that are on the right subtree.
下面代码:
Map<Integer, Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
map = new HashMap<>(inorder.length);
//Record the correspondence between in-order traversal values and subscripts
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;
}
//有返回值,Because the splicing tree is used
//The methods in the method body are only available at the current moment,不是全局的
private TreeNode build( int leftPre, int rightPre,int leftIn, int[] preorder, int[] inorder) {
//After determining the left subtree,得到左子树的长度,Values that exceed the bounds indicate that there are no subtrees left.
if(leftPre>rightPre){
return null;
}
//根节点的值
int rootVal = preorder[leftPre];
TreeNode root = new TreeNode(rootVal);
//The position of the current node in the inorder sequence
int indexInOrder = map.get(rootVal);
//左子树的长度
int leftLen = indexInOrder-leftIn;
//leftPre:The position of the current value in the preorder
//rightPre:The position where the current value is the largest in the preorder
//leftIn:inorderthe left border in (Used to determine length)
//When exploring the left subtree,from the left of the current node,Start looking for the first one in the pre-order
root.left= build(leftPre+1, leftPre+leftLen, leftIn , preorder, inorder);
//explore the right subtree
root.right= build(leftPre+leftLen+1, rightPre, indexInOrder+1 , preorder, inorder);
return root;
}

106. 从中序与后序遍历序列构造二叉树
题目:106. 从中序与后序遍历序列构造二叉树
Post-order traversal is done:从最后一个开始,Each time as the root node,But the right subtree is constructed first.
其余几乎一模一样,But this is the right border to be set here.
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) {
//After determining the left subtree,得到左子树的长度
if(leftPre>rightPre){
return null;
}
//根节点的值
int rootVal = postorder[rightPre];
TreeNode root = new TreeNode(rootVal);
//The position of the current node in the inorder sequence
int indexInOrder = map.get(rootVal);
//右子树的长度
int rightLen = rightIn-indexInOrder;
//rightIn为啥是-1,Because it is from right to left
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;
}

边栏推荐
- 秒云成功入选《2022爱分析 · 银行数字化厂商全景报告》,智能运维能力获认可
- 第二批养老理财试点产品发行 一小时销售20亿元
- 知网网站地址更换
- Mysql高级篇学习总结13:多表连接查询语句优化方法(带join语句)
- ROI LTV CPA ECPM体系讲解
- 将博客搬至CSDN
- cubemx stm32 afm3000模块 气体流量传感器 驱动代码
- Win11 file types, how to change?Win11 modify the file suffix
- Doing Homework HDU - 1074
- AWS Lambda related concepts and implementation approach
猜你喜欢

Mysql高级篇学习总结13:多表连接查询语句优化方法(带join语句)

The use of DDR3 (Naive) in Xilinx VIVADO (3) simulation test

利用pytest hook函数实现自动化测试结果推送企业微信

图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)

深度学习100例 —— 卷积神经网络(CNN)天气识别

【Idea系列】idea配置

Leetcode刷题——543. 二叉树的直径、617. 合并二叉树(递归解决)

数字知识库及考学一体化平台

【LeetCode】98.验证二叉搜索树

audio_policy_configuration.xml配置文件详解
随机推荐
ORA-00054 资源正忙
Small program containers accelerate the construction of an integrated online government service platform
【LeetCode】701.二叉搜索树中的插入操作
强烈推荐一款优秀且通用的后台管理系统
图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
ORB-SLAM3中的优化
Doing Homework HDU - 1074
audio_policy_configuration.xml配置文件详解
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)
DB2查看执行过长的SQL
Win11 file types, how to change?Win11 modify the file suffix
vector中函数emplace_back的实现原理
Leetcode刷题——543. 二叉树的直径、617. 合并二叉树(递归解决)
Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)
MTBF是什么意思?交换机做MTBF有什么要求?MTTF、MTBF和MTTR的区别是什么?
命令模式(Command)
热成像测温的原理是什么呢?你知道吗?
Business collocations
Use pytest hook function to realize automatic test result push enterprise WeChat