pat甲级_树的遍历(例题:1020. Tree Traversals 、1086. Tree Traversals、1099. Build A Binary Search Tree)

这篇博客介绍了PAT甲级考试中关于树的遍历问题,包括前序、中序、后序和层序遍历,并通过例题1020、1086和1099讲解了如何根据后序和中序遍历重建二叉搜索树以及如何从堆栈操作序列构建二叉树,并给出了相应的后序遍历结果。
摘要由CSDN通过智能技术生成

一般pat考察树的题目会给出一个数组,数组中的数字将是构造树的元素。根据题目的一些特殊要求,可以构造出这棵树,然后根据题目的输出要求遍历输出这棵树。


pat对树的考察必不可少的就是考察对树的各种遍历

前序遍历    根->左->右

中序遍历    左->根->右

后序遍历    左->右->根

以上三种遍历利用递归或者stack(先进后出)可实现

层序遍历利用queue(先进先出)可实现


1020. Tree Traversals (25):

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 <stdio.h>
#include <vector>
#include <map>
#include <queue>
using namespace std;

struct treeNode
{
	int val;
	treeNode* left;
	treeNode* right;
	treeNode()
	{
		val=-1;
		left=NULL;
		right=NULL;
	}
};
map<int,int> post;                              //后续遍历相当于一个字典,目录是输入的数据,得到的结果的最大值就是根节点
vector<int> in;               
vector<bool> visit;
treeNode* findleaves(vector<int> data);
int main()
{
	int n;
	scanf("%d",&n);
	in.resize(n);
	visit.resize(n,false);
	for(int i=0;i<n;i++) 
	{
		int a;
		scanf("%d",&a);
		post[a]=i;
	}

	for(int i=0;i<n;i++) scanf("%d",&in[i]);
	treeNode* root;
	root=findleaves(in);

	queue<treeNode*> tqe;
	tqe.push(root);
	printf("%d",tqe.front()->val);
	while(!tqe.empty())
	{
		if(tqe.front()->left!=NULL) tqe.push(tqe.front()->left);
		if(tqe.front()->right!=NULL) tqe.push(tqe.front()->right);
		tqe.pop();
		if(tqe.empty()) break;
		if(tqe.front()->val>0) printf(" %d",tqe.front()->val);
	}
	return 0;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值