给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
import java.io.BufferedInputStream;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class TreeNode {
int data;
TreeNode left, right;
}
public class Main {
public static int[] post = new int[31];
public static int[] in = new int[31];
public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int n = cin.nextInt();
for (int i = 0; i < n; ++i) {
in[i] = cin.nextInt();
}
for (int i = 0; i < n; ++i) {
post[i] = cin.nextInt();
}
cin.close();
TreeNode node = createTree(post, 0, in, 0, n);
cengxu(node);
}
private static void cengxu(TreeNode node) {
if(node==null)return;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(node);
boolean flag=true;
while(!queue.isEmpty()){
TreeNode cur=queue.remove();
if(flag){
System.out.print(cur.data);
flag=false;
}
else System.out.print(" "+cur.data);
if(cur.right!=null){
queue.add(cur.right);
}if(cur.left!=null){
queue.add(cur.left);
}
}
}
private static TreeNode createTree(int[] post, int i, int[] in, int i1, int n) {
if(n<=0)return null;
TreeNode tr=new TreeNode();
tr.data=post[i];
int p;
for (p = 0; p< n; ++p) {
if (in[i1 + p] == tr.data)
break;
}
tr.left = createTree(post, i+1, in, i1, p);
tr.right = createTree(post, i + p+1, in, i1 + p+1, n - p - 1);
return tr;
}
}