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

输入格式:

输入第一行给出一个正整数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.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

static int[] midArr;
static int[] preArr;
static int n;
static boolean flag = false;

static class Node{
Node l;
Node r;
int data;
}

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

n = scan.nextInt();

midArr = new int[n+1];
preArr = new int[n+1];

for (int i = 1; i <= n; i++) {
midArr[i] = scan.nextInt();
}

for (int i = 1; i <= n; i++) {
preArr[i] = scan.nextInt();
}


Node root = fn(1,n,1,n);

levelOrder(root);
}

private static void levelOrder(Node root) {

List<Node> ls = new ArrayList<>();
ls.add(root);

while (!ls.isEmpty()){
Node node = ls.remove(0);
if (!flag){
flag = true;
System.out.print(node.data);
}else {
System.out.print(" " + node.data);
}

if (node.l!=null) ls.add(node.l);
if (node.r!=null) ls.add(node.r);
}

}

private static Node fn(int preS, int preE, int midS, int midE) {

if (preS>preE || midS>midE){
return null;
}

int x = preArr[preS];
Node root = new Node();
root.data = x;

for (int i = midS; i <= midE; i++) {
if (midArr[i]==x){
int k = i - midS; // 左子树长度
// 镜像构造
root.r = fn(preS+1,preS+k, midS, i-1);
root.l = fn(preS+k+1,preE, i+1, midE);
}
}

return root;
}
}