Java教程

【数据结构习题】PTA 7-2 树的遍历 后序遍历+中序遍历实现

本文主要是介绍【数据结构习题】PTA 7-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

数据结构杀疯了,对不起我真的不懂你TT

后序遍历+中序遍历思想:

知道这个思想之后,我们开始写后序遍历+中序遍历的代码:
递归思想
这个自己手写一下就能懂了(虽然我搞了无敌久才弄懂)

Tree PostAndIn(int front1,int rear1,int front2,int rear2)
{
	Tree root=new struct TreeNode;
	root->data=Post[rear1];
	root->left=root->right=NULL;
	int p=front2;
	while(In[p]!=Post[rear1])
		p++;
	int num=p-front2;//左子树节点的个数
	if(p!=front2)
		root->left=PostAndIn(front1,front1+num-1,front2,p-1);
	if(p!=rear2)
		root->right=PostAndIn(front1+num,rear1-1,p+1,rear2);
	return root;
}

接下来就是层序遍历了,其实很简单,层序遍历就是从上到下,从左到右输出,like:
在这里插入图片描述
这棵二叉树的层序遍历序列就是 [ 1 , 4 , 2 , 7 , 20 , 5 ]

层序遍历我们一般用队列实现:

// 0. 声明队列
queue<Tree> t;
// 1. 将根节点加入队列
t.push(root);
// 2. 遍历队列中每个节点
while(!t.empty()) 
{
    root=t.front(); //3.记录当前根节点值
	t.pop(); //4.删除根节点值
	cout<<root->data; //5.输出根节点值(题目要求)
	if(root->left) //如果此时的根节点有左孩子
		t.push(root->left); //将左孩子加入队列中
	if(root->right) //同上
		t.push(root->right);
	if(!t.empty()) //控制输出格式
		cout<<" ";	
}

主函数中直接调用这两个函数即可
完整代码:

#include <bits/stdc++.h>
using namespace std;
int Post[35],In[35];
typedef struct TreeNode
{
	int data;
	TreeNode *left;
	TreeNode *right;
}Node,*Tree ;
//Node=struct TreeNode
//*Tree是指向该结构体的指针,即给struct TreeNode * 取个别名为*Tree 
Tree PostAndIn(int front1,int rear1,int front2,int rear2)
{
	Tree root=new struct TreeNode;
	root->data=Post[rear1];
	root->left=root->right=NULL;
	int p=front2;
	while(In[p]!=Post[rear1])
		p++;
	int num=p-front2;//左子树节点的个数
	if(p!=front2)
		root->left=PostAndIn(front1,front1+num-1,front2,p-1);
	if(p!=rear2)
		root->right=PostAndIn(front1+num,rear1-1,p+1,rear2);
	return root;
}
void Sequence(Tree root)
{
	queue<Tree> t;
	if(root)
		t.push(root);
	while(!t.empty())
	{
		root=t.front();
		t.pop();
		cout<<root->data;
		if(root->left)
			t.push(root->left);
		if(root->right)
			t.push(root->right);
		if(!t.empty())
			cout<<" ";	
	}
}
int  main()
{
	int n,i;
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>Post[i];
	}
	for(i=0;i<n;i++)
	{
		cin>>In[i];
	}
	Tree root=PostAndIn(0,n-1,0,n-1);
	Sequence(root);
	return 0;
}
这篇关于【数据结构习题】PTA 7-2 树的遍历 后序遍历+中序遍历实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!