当前位置:网站首页>已知中序遍历数组和先序遍历数组,返回后序遗历数组
已知中序遍历数组和先序遍历数组,返回后序遗历数组
2022-08-02 00:01:00 【小卢要刷力扣题】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,
能否不重建树,而直接生成这个二叉树的后序数组并返回
已知二叉树中没有重复值
解题思路
定义f函数void类型
把先序遍历数组,跟范围L1, R1.
把中序遍历数组,跟范围L2, R2
填后序遍历数组,范围L3, R3,三段范围等长在中序遍历定位X确定左树跟右树规模
但定位了前序,中序,后序的X后
调用递归,生成左树,右树
代码
public static int[] preInToPos1(int[] pre, int[] in) {
if (pre == null || in == null || pre.length != in.length) {
return null;
}
int N = pre.length;
int[] pos = new int[N];
process1(pre, 0, N - 1, in, 0, N - 1, pos, 0, N - 1);
return pos;
}
// L1...R1 L2...R2 L3...R3
public static void process1(int[] pre, int L1, int R1, int[] in, int L2, int R2, int[] pos, int L3, int R3) {
if (L1 > R1) {
return;
}
if (L1 == R1) {
pos[L3] = pre[L1];
return;
}
pos[R3] = pre[L1];
int mid = L2;
for (; mid <= R2; mid++) {
if (in[mid] == pre[L1]) {
break;
}
}
int leftSize = mid - L2;
process1(pre, L1 + 1, L1 + leftSize, in, L2, mid - 1, pos, L3, L3 + leftSize - 1);
process1(pre, L1 + leftSize + 1, R1, in, mid + 1, R2, pos, L3 + leftSize, R3 - 1);
}
使用哈希表来代替遍历查找过程
public static int[] zuo(int[] pre, int[] in) {
if (pre == null || in == null || pre.length != in.length) {
return null;
}
int N = pre.length;
HashMap<Integer, Integer> inMap = new HashMap<>();
for (int i = 0; i < N; i++) {
inMap.put(in[i], i);
}
int[] pos = new int[N];
func(pre, 0, N - 1, in, 0, N - 1, pos, 0, N - 1, inMap);
return pos;
}
public static void func(int[] pre, int L1, int R1, int[] in, int L2, int R2, int[] pos, int L3, int R3,
HashMap<Integer, Integer> inMap) {
if (L1 > R1) {
return;
}
if (L1 == R1) {
pos[L3] = pre[L1];
} else {
pos[R3] = pre[L1];
int index = inMap.get(pre[L1]);
func(pre, L1 + 1, L1 + index - L2, in, L2, index - 1, pos, L3, L3 + index - L2 - 1, inMap);
func(pre, L1 + index - L2 + 1, R1, in, index + 1, R2, pos, L3 + index - L2, R3 - 1, inMap);
}
}```
边栏推荐
猜你喜欢
随机推荐
面试高频考题解法——栈的压入弹出序列、有效的括号、逆波兰表达式求值
solidity
Win11如何获得最佳电源效率?
12306抢票,极限并发带来的思考?
字节跳动面试官:请你实现一个大文件上传和断点续传
contentEditable属性
go语言标准库fmt包怎么使用
07-SDRAM: FIFO control module
协作乐高 All In One:DAO工具大全
An interesting project--Folder comparison tool (1)
利用“栈”快速计算——逆波兰表达式
【解决】win10下emqx启动报错Unable to load emulator DLL、node.db_role = EMQX_NODE__DB_ROLE = core
els block deformation
【Leetcode】478. Generate Random Point in a Circle(配数学证明)
ES中SQL查询详解
检查 Oracle 版本的 7 种方法
【MySQL系列】MySQL索引事务
els 方块变形
如何用Redis实现分布式锁?
【加密周报】经济衰退在加息气氛中蔓延 美联储“放手一搏”?盘点上周加密市场发生的重大事件