当前位置:网站首页>剑指 Offer 07. 重建二叉树
剑指 Offer 07. 重建二叉树
2022-06-27 07:05:00 【Yake1965】
剑指 Offer 07. 重建二叉树
递归
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0) return null;
TreeNode root = new TreeNode(preorder[0]);
// 问题一:找根结点的位置,通过 HashMap 解决。
int idx = 0;
for(; idx < inorder.length; idx++){
if(inorder[idx] == preorder[0]) break;
}
// 问题二:java 数组不能获取子数组,通过拷贝或索引解决。
if(idx >= 0){
root.left = this.buildTree(Arrays.copyOfRange(preorder, 1, idx + 1), Arrays.copyOfRange(inorder, 0, idx));
}
if(idx <= preorder.length - 1){
root.right = this.buildTree(Arrays.copyOfRange(preorder, idx + 1, preorder.length), Arrays.copyOfRange(inorder, idx + 1, inorder.length));
}
return root;
}
}
| 根节点前序索引 | 中序左边界 | 中序右边界 | |
|---|---|---|---|
| 左子树 | rootidx + 1 | left | i - 1 |
| 右子树 | rootidx + i - left + 1 | i + 1 | right |
TIPS: i - left + rootidx + 1 含义为 根节点索引 + 左子树长度 + 1
class Solution {
HashMap<Integer, Integer> d = new HashMap<>(); // 类变量
public TreeNode buildTree(int[] preorder, int[] inorder) {
// 中序中根结点分割左右子树 [left, idx), (idx, right)
// 方便获取根结点的位置
for(int i = 0; i < inorder.length; i++)
d.put(inorder[i], i);
// rootidx = 0, left = 0, right = inorder.length - 1
return recur(preorder, 0, 0, inorder.length - 1);
}
// 根结点索引在 preorder 中计算,范围在 inorder 中计算。
TreeNode recur(int[] preorder, int ridx, int left, int right) {
if(left > right) return null; // 递归终止
TreeNode node = new TreeNode(preorder[ridx]); // 建立根节点
int i = d.get(preorder[ridx]); // 根节点划分左右子树
node.left = recur(preorder, ridx + 1, left, i - 1); // 开启左子树递归
node.right = recur(preorder, ridx + i - left + 1, i + 1, right); // 开启右子树递归
return node;
}
}
迭代
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length, idx = 0; // inorder 索引
if(preorder == null || n == 0) return null;
TreeNode root = new TreeNode(preorder[0]);
Deque<TreeNode> q = new ArrayDeque<>();
q.push(root);
for(int i = 1; i < n; i++){
// 遍历 preorder
int val = preorder[i]; // 前序值
TreeNode top = q.peek();
if(top.val != inorder[idx]){
// 构造左结点
top.left = new TreeNode(val);
q.push(top.left);
} else {
while(!q.isEmpty() && q.peek().val == inorder[idx]){
top = q.pop();
idx++; // 遍历 inorder
}
top.right = new TreeNode(val); // 构造右结点
q.push(top.right);
}
}
return root;
}
}
边栏推荐
- uview的安装和功能
- Interviewer: how to never migrate data and avoid hot issues by using sub database and sub table?
- 【软件工程】山东大学软件工程复习提纲
- Vs how to configure opencv? 2022vs configuration opencv details (multiple pictures)
- Xiaomi Interviewer: let's talk about the proficient Registration Center for three days and three nights
- Yolov6's fast and accurate target detection framework is open source
- Interviewer: do you have any plan to request a lot of data that does not exist in redis to destroy the database?
- 请问如何将数据从oracle导入fastDFS?
- JDBC操作Mysql示例
- Installation and functions of uview
猜你喜欢

Win10 remote connection to ECS

(resolved) NPM suddenly reports an error cannot find module 'd:\program files\nodejs\node_ modules\npm\bin\npm-cli. js‘
![[openairinterface5g] rrcsetupcomplete for RRC NR resolution](/img/61/2136dc37b98260e09f3be9979492b1.jpg)
[openairinterface5g] rrcsetupcomplete for RRC NR resolution

Oppo interview sorting, real eight part essay, abusing the interviewer

在线文本数字识别列表求和工具

volatile 和 synchronized 到底啥区别?

YOLOv6又快又准的目标检测框架 已开源

Park and unpark in unsafe

Vs how to configure opencv? 2022vs configuration opencv details (multiple pictures)

IDEA连接数据库报错
随机推荐
View functions in tidb
2022 CISP-PTE(一)文件包含
One person manages 1000 servers? This automatic operation and maintenance tool must be mastered
Guava tutorial collect some cases and write Google tool classes slowly
mysql关于自增和不能为空
IDEA连接数据库报错
Mathematical modeling contest for graduate students - optimal application of UAV in rescue and disaster relief
(resolved) NPM suddenly reports an error cannot find module 'd:\program files\nodejs\node_ modules\npm\bin\npm-cli. js‘
Idea one click log generation
How torch.gather works
NoViableAltException([email protected][2389:1: columnNameTypeOrConstraint : ( ( tableConstraint ) | ( columnNameT
Interviewer: please introduce cache penetration, cache null value, cache avalanche and cache breakdown, which are easy to understand
Unsafe中的park和unpark
SQL考勤查询间隔一小时
JDBC读取Mysql数据列表
Park and unpark in unsafe
Interviewer: how to never migrate data and avoid hot issues by using sub database and sub table?
YOLOv6又快又准的目标检测框架 已开源
2022 CISP-PTE(二)SQL注入
如何优雅的写 Controller 层代码?