给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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;
}
}