5-6 树的遍历
分数 20
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
起先毫无头绪,这篇帖子(2条消息) 【数据结构习题】PTA 7-2 树的遍历 后序遍历+中序遍历_真的吃很多的博客-CSDN博客_给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都博主说的很清楚,我主要是全部用的C语言写的,然后多写了一点注释
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
typedef struct TNode *Position;
typedef Position BinTree;
int Post[35];
int In[35];//定义全局变量
void LevelorderTraversal( BinTree BT );
BinTree CreatBinTree(int front1,int rear1,int front2,int rear2);
void visit(int Data);
int main()
{
int N;
if(scanf("%d",&N) )//pta时常因为scanf返回值的原因报错,所以这里采用这种方式规避错误
{
}
//给出后序的序列
for(int i=0;i<N;i++)
{
if(scanf("%d",&Post[i]))
{
}
}
//给出中序的序列
for(int i=0;i<N;i++)
{
if(scanf("%d",&In[i]))
{
}
}
//给出根节点
BinTree root=CreatBinTree(0,N-1,0,N-1);
LevelorderTraversal( root );
}
BinTree CreatBinTree(/*后序*/int front1,int rear1,/*中序*/int front2,int rear2)
{
BinTree root=(BinTree )malloc(sizeof(struct TNode));//创建根节点
root->Data=Post[rear1];//根节点使后序遍历中的最后一个元素
root->Left=root->Right=NULL;//先给根节点的左右子树赋空值
int p=front2;
while(In[p]!=Post[rear1])//从中序序列中开始查找元素,直到找到根结点,p就是中序序列中根节点的下标
p++;
int num=p-front2;//根节点下标-起始点下标=左子树结点个数
if(num!=0)//只要再中序序列中找到的根节点下标不等于中序序列的最左下标,那么存在左子树
root->Left=CreatBinTree(front1,front1+num-1,front2,p-1);//创建左子树
if(p!=rear2)//只要在中序序列中找到的根节点下标不等于中序序列的最右下标,那么存在右子树
root->Right=CreatBinTree(front1+num,rear1-1,p+1,rear2);
return root;
}
void LevelorderTraversal( BinTree BT )//层次遍历
{
//创建队列
Position que[100];//指针数组 类似于int *p【3】 每一个p[i]都是指针,指向int型数据
//同理 que【i】都是指针,指向的是struct TNode型数据
int front=0,rear=0;
if(BT)//只要树不为空
{
que[rear]=BT;//入队
rear=(rear+1)%100;
while(front!=rear)//队列非空的条件
{
Position p=que[front];
visit(p->Data);
front=(front+1)%100;//结点出队并访问
if(p->Left)
{
que[rear]=p->Left;
rear=(rear+1)%100;
}
if(p->Right)
{
que[rear]=p->Right;
rear=(rear+1)%100;
}
if(front!=rear)
{
printf(" ");
}
}
}
}
void visit(int Data)
{
printf("%d",Data);
}