当前位置:网站首页>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;
}
边栏推荐
猜你喜欢
Using .NET to simply implement a high-performance clone of Redis (2)
Leetcode刷题——构造二叉树(105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树)
Heap Sort
职责链模式(responsibilitychain)
[Flight Control Development Advanced Course 7] Crazy Shell Open Source Formation UAV - Formation Flight
AWS Lambda related concepts and implementation approach
【LeetCode】700.二叉搜索树
Jenkins使用手册(1) —— 软件安装
Maple 2022 software installation package download and installation tutorial
【Inspirational】The importance of review
随机推荐
知网网站地址更换
BOSS 直聘回应女大学生连遭两次性骚扰:高度重视求职者安全,可通过 App 等举报
Business collocations
RL78开发环境
单调栈一些题目练习
The use of DDR3 (Naive) in Xilinx VIVADO (2) Read and write design
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
使用json-server快速搭建本地数据接口
数字知识库及考学一体化平台
cubemx stm32 afm3000 module gas flow sensor driver code
cat /proc/kallsyms found that the kernel symbol table values are all 0
技术干货 | 用零信任保护代码安全
linux下数据库初始化密码
MySQL不提供数组,只能做成表吗?
【LeetCode】232.用栈实现队列
小程序容器加快一体化在线政务服务平台建设
Mysql数据类型
图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
Zikko上市同时搭载HDMI2.1和2.5GbE新款雷电4扩展坞
C language * Xiaobai's adventure