L2-3. 玩转二叉树
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
以下为java代码:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Tree { public static int[] pre; //前序排列 public static int[] mid; //中序排列 public static int[] left = new int[1000]; //对应index的左子树 public static int[] right = new int[1000]; //对应index的右子树 public static void main(String[] args){ //接收终端输入的数据 Scanner input = new Scanner(System.in); int num = input.nextInt(); pre = new int[num]; mid = new int[num]; for(int i=0;i<num;i++){ mid[i] = input.nextInt(); } for(int i=0;i<num;i++){ pre[i] = input.nextInt(); } sort(0,0,num-1); //通过前序与中序排列还原树 Queue<Integer> q = new LinkedList<Integer>(); q.add(pre[0]); print(q); } /* * 通过前序与中序排列还原树 * root为前序可确定的根 * start与end为对应中序进行寻找的起始与终点 */ public static int sort(int root,int start,int end){ if(start>end) return 0; for(int i=start;i<=end;i++){ if(pre[root]==mid[i]){ left[pre[root]] = sort(root+1,start,i-1); right[pre[root]] = sort(root+1+i-start,i+1,end); } } return pre[root]; } /* * 镜面反转再层序遍历-->按层序输出,每层从最右端开始输出即可 * 用到队列 */ public static void print(Queue<Integer> q){ int temp = 0; while(!q.isEmpty()){ int a = q.poll(); if(temp==0){ System.out.print(a); temp++; } else{ System.out.print(" "+a); } if(right[a]!=0) q.add(right[a]); if(left[a]!=0) q.add(left[a]); } } }