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

边栏推荐
猜你喜欢

C#/VB.NET:在 Word 中设置文本对齐方式

Digital management insight into retail and e-commerce operations - retail password

God Space - the world's first Web3.0-based art agreement creative platform, broadening the boundaries of multi-art integration

MATLAB程序设计与应用 3.2 矩阵变换

Graphical Hands-on Tutorial--ESP32 OTA Over-the-Air Upgrade (VSCODE+IDF)

Jenkins User Manual (1) - Software Installation

Events in August | 51CTO's 17th Anniversary Celebration, post a blog post to get gifts such as tea sets/notebooks/T-shirts!

cubemx stm32 afm3000模块 气体流量传感器 驱动代码
![[Flight Control Development Advanced Course 7] Crazy Shell Open Source Formation UAV - Formation Flight](/img/58/19a50af5e187df0f37a1a3298c029b.png)
[Flight Control Development Advanced Course 7] Crazy Shell Open Source Formation UAV - Formation Flight

Jenkins使用手册(1) —— 软件安装
随机推荐
入门MySql表的增删查改
使用.NET简单实现一个Redis的高性能克隆版(二)
你知道吗?那些专属于代码的浪漫~
知网网站地址更换
Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)
小程序实战(一)- 骨架屏的应用与实现
少即是多:视觉SLAM的点稀疏化(IROS 2022)
将博客搬至CSDN
cubemx stm32 afm3000 module gas flow sensor driver code
图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)
Jenkins使用手册(1) —— 软件安装
Meishe Q&A Room | Meiying VS Meishe Cloud Editing
vector中函数emplace_back的实现原理
ROI LTV CPA ECPM体系讲解
datax oracle to oracle增量同步
Leetcode brush questions - binary search tree related topics (98. Verify binary search tree, 235. The nearest common ancestor of binary search tree, 1038. From binary search tree to bigger sum tree, 5
123
linux下数据库初始化密码
Using .NET to simply implement a high-performance clone of Redis (2)
第二批养老理财试点产品发行 一小时销售20亿元