L2-3 玩转二叉树 java

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]);
		}
		
	}
	
}
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值