PAT (Advanced Level) Practice-1020 Tree Traversals

本文介绍了一种根据给定的后序遍历和中序遍历序列构建二叉树,并输出该树的层次遍历序列的方法。通过递归地找到每个子树的根节点,构造出整棵二叉树,再利用队列进行层次遍历,最终得到预期的输出序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

7

2 3 1 5 7 6 4

1 2 3 4 5 6 7

Sample Output:

4 1 6 3 5 7 2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

#define maxn 35
int n;

int postorder[maxn], inorder[maxn];

typedef struct node{
	int value;
	node *left, *right;
	node(int v=0, node *left=NULL, node *right=NULL):value(v),left(left),right(right){}
}*root;

void build(root tree, int left, int right, int post){		//left,right是中序遍历的边界,post是元素在后序遍历中的序号
	if(tree==NULL)
		return ;
	int mid=0;
	for(int i=left; i<=right; ++i){
		if(inorder[i]==tree->value){
			mid = i;
			break;
		}
	}
	int rlen=right-mid;
	int llen=mid-left;
	if(llen>0){
		tree->left = new node(postorder[post-rlen-1]);			
		build(tree->left, left, mid-1, post-rlen-1);
	}
	else{
		tree->left=NULL;
	}
	if(rlen>0){
		tree->right = new node(postorder[post-1]);
		build(tree->right, mid+1, right, post-1);
	}
	else{
		tree->right=NULL;
	}
}


void detree(root tree){
	if(tree==NULL)
		return ;
	detree(tree->left);
	detree(tree->right);
	delete(tree);
}

int main(){
	queue<root> q;
	while(cin >> n){

		for(int i=1; i<=n; ++i){
			cin >> postorder[i];
		}
		for(int i=1; i<=n; ++i){
			cin >> inorder[i];
		}
		root tree = new node(postorder[n]);
		build(tree, 1, n, n);
		vector<int> v;
		q.push(tree);
		while(!q.empty()){
			root rt = q.front();
			if(rt->left!=NULL)
				q.push(rt->left);
			if(rt->right!=NULL)
				q.push(rt->right);
			q.pop();
			v.push_back(rt->value);
		}

		cout << v[0];
		for(int i=1; i<v.size(); ++i){
			cout << ' ' << v[i];
		}
		cout << endl;
		detree(tree);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值