PTA7-2 树的遍历

题目描述

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

输入格式:

输入第一行给出一个正整数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
结尾无空行

AC代码

扫描二维码关注公众号,回复: 13454775 查看本文章
#include <iostream>
#include <queue> 
using namespace std;

const int N = 30;
int post[N], in[N];
int n, cnt;

struct Node
{
    
    
	int data;
	Node *LChild;
	Node *RChild;
};
typedef Node *Tree;

void createTree(Tree &T, int *post, int *in, int len)
{
    
    
	T = new Node;
	if (len <= 0)
	{
    
    
		T = NULL;
		return;
	}
	T->data = post[len - 1];
	int t;
	for (int i = 0; i < len; i ++)
		if (in[i] == post[len - 1]) 
		{
    
    
			t = i;
			break;
		}
	createTree(T->LChild, post, in, t);
	createTree(T->RChild, post + t, in + (t + 1), len - t - 1);
}
void preTraverse(Tree T)
{
    
    
	if (T)
	{
    
    
		cout << T->data << ' ';
		preTraverse(T->LChild);
		preTraverse(T->RChild); 
	}
}
void levelTraverse(Tree T)
{
    
    
	queue<Node*> q;
	if (T) q.push(T);
	while (!q.empty())
	{
    
    
		Node *temp = q.front();
		cout << temp->data;
		cnt ++;
		if (cnt != n) cout << ' ';
		q.pop();
		if (temp->LChild) q.push(temp->LChild);
		if (temp->RChild) q.push(temp->RChild);
	 } 
}
int main()
{
    
    
	cin >> n;
	for (int i = 0; i < n; i ++) cin >> post[i];
	for (int i = 0; i < n; i ++) cin >> in[i];	
	Tree T;
	createTree(T, post, in, n);
//	preTraverse(T);
	levelTraverse(T);
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/Shao_yihao/article/details/121074134