PTA【玩转二叉树】Java

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2

代码实现:

import java.io.*;
import java.util.TreeMap;

public class Main {
     
	static String[] pre, in;
	static TreeMap<Integer, String> map = new TreeMap<>();

	public static void main(String[] args) throws IOException {
     
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		in = br.readLine().split(" ");// 中序
		pre = br.readLine().split(" ");// 前序
		bfs(0, n - 1, 1, 0);
		String str = "";
		for (String s : map.values())
			str += s + " ";
		out.print(str.trim());
		out.flush();
	}

	private static void bfs(int start, int end, int index, int root) {
     
		if (start <= end) {
     
			int i = start;
			while (i < end && !pre[root].equals(in[i]))
				i++;
			map.put(index, pre[root]);// 根
			bfs(i + 1, end, index * 2, root + 1 + i - start);// 右(翻转后为左)
			bfs(start, i - 1, index * 2 + 1, root + 1);// 左(翻转后为右)
		}
	}
}

运行结果PTA【玩转二叉树】Java_第1张图片

你可能感兴趣的:(天梯,二叉树,算法,java)