时间限制
400 ms
内存限制
64 MB
题目描述:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
给定二叉树的后序中序 求出该二叉树的前序
emmmmmmm
递归分解后序
在中序中找出根的位置
然后在中序中 根的位置 继续递归
根的位置 两边就是左右子树
还有需要注意
二叉树后序遍历是左右根 而前序遍历是根左右
无法直接从后序递归成前序 所以需要记录他们的下标 以下表从小到大来输出
import java.io.*;
import java.math.*;
import java.util.*;
public class Main
{
static int N = 30;
static int hou[] = new int[N + 10];
static int zhong[] = new int[N + 10];
static TreeMap<Integer, Integer> tr = new TreeMap<Integer, Integer>();
static int n;
static void toqian(int start, int end, int left, int right, int node)
{
if (start > end || left > right)
return;
tr.put(node, hou[end]);
for (int i = left; i <= right; i++)
{
if (zhong[i] == hou[end])
{
toqian(start, start + i - left - 1, left, i - 1, node << 1);
toqian(start + i - left, end - 1, i + 1, right, node << 1 | 1);
}
}
}
public static void main(String[] args)
{
n = sc.nextInt();
for (int i = 1; i <= n; i++)
hou[i] = sc.nextInt();
for (int i = 1; i <= n; i++)
zhong[i] = sc.nextInt();
toqian(1, n, 1, n, 1);
int pos = 0;
for (int i : tr.keySet())
{
if (pos++ != 0)
out.print(" ");
out.print(tr.get(i));
}
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!