L2-006. 树的遍历

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2

思路:1.采用递归思想构造二叉树

           2.采用队列存储节点,层次遍历二叉树

java代码如下:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;


 class TreeNode {
	int val;
	TreeNode right;
	TreeNode left;
	TreeNode(int val){
		this.val=val;
	}
}

 class Main {
	public static TreeNode reConstructBinaryTree(int start1,int end1,int[] after,int start2,int end2,int[] in) {//构造二叉树
		if(start1>end1) {
			return null;
		}else {
			TreeNode treeNode=new TreeNode(after[end1]);
			int i;
			for(i=start2;i<=end2;i++) {
				if(after[end1]==in[i]) {
					break;
				}
			}
			treeNode.left=reConstructBinaryTree(start1,start1+i-start2-1,after,start2,i-1,in);
			treeNode.right=reConstructBinaryTree(end1-(end2-i),end1-1,after,i+1,end2,in);
			return treeNode;
		}
	}
	public static void printf(TreeNode treeNode) {//层次遍历
		Queue<TreeNode> queue=new LinkedList<TreeNode>();
		queue.offer(treeNode);
		while(!queue.isEmpty()) {
			TreeNode queueHead=queue.poll();
			if(queueHead.left!=null) {
				queue.offer(queueHead.left);
			}
			if(queueHead.right!=null) {
				queue.offer(queueHead.right);
			}
			if(!queue.isEmpty()) {
				System.out.print(queueHead.val+" ");
			}else{
				System.out.print(queueHead.val);
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int[] after=new int[n];
		int[] in=new int[n];
		for(int i=0;i<n;i++) {
			after[i]=scanner.nextInt();
		}
		for(int i=0;i<n;i++) {
			in[i]=scanner.nextInt();
		}
		scanner.close();
		TreeNode treeNode=reConstructBinaryTree(0,after.length-1,after,0,in.length-1,in);
		printf(treeNode);
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值