二叉树的操作
任务一:
创建一颗二叉树,并对其进行前序、中序、后序遍历
任务描述:
本关任务:创建一颗二叉树,并对其进行前序、中序、后序递归遍历。
相关知识:
为了完成本关任务,你需要掌握:
1.如何创建一棵二叉树
2.如何对二叉树进行三种遍历。
- 创建一棵二叉树
最简单的算法就是使用递归算法。
利用二叉树的递归特性
创建一棵二叉树的递归算法:
当树不为空树时
{
创建根结点,给根结点赋值
递归创建左子树
递归创建右子树
}
- 二叉树的前序、中序、后序遍历
根据根结点的位置不同,可分为前序、中序、后序三种遍历方式。
前序:根结点-左子树-右子树
中序 左子树-根结点-右子树
后序 左子树-右子树-根结点
以中序遍历为例,递归算法如下
void INORDER(bitree *t)
{if(t不为空)
INORDER(t的左子树)
输出根结点(注意,按%4d格式输出,可以测试结果匹配)
INORDER(t的右子树)
}
- 注意事项
本程序中用到malloc函数,应加上头文件<stdlib.h>或<malloc.h>
NULL在编译器中已经预定义,表示空指针,可以直接使用。
注意二叉树的结点输入是以先序遍历的方式进行输入。如果左子树或右子树为空,输入0表示空树。如需要创建如下图所示的二叉树,输入序列为:
1 2 4 0 0 5 8 0 0 0 3 6 0 0 7 0 9 0 0
输出根结点时,按照%4d的格式输出,可以测试集匹配。
测试说明:
①
测试输入:1 2 3 0 0 0 0
先序遍历的结果: 3 2 1
中序遍历的结果: 1 2 3
后序遍历的结果: 3 2 1
②
测试输入:1 2 3 0 0 0 4 0 5 0 0
前序遍历的结果: 1 2 3 4 5
中序遍历的结果: 3 2 1 4 5
后序遍历的结果: 3 2 5 4 1
- 示例代码如下:(温馨提示:本文全部代码只在 EduCoder 平台上通过测试,仅供参考,如有运行错误请自行改正)
/*-----------------------------------bitree1.c----------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{ int data;
struct node *lchild,*rchild;
} bitree;
/*-----------请在下面区域补充代码---begin---------------------------------------------*/
bitree *creat() //建立二叉树的递归算法
{
bitree *t;
int x;
scanf("%d",&x);
if(x==0)
t=NULL; //以x=0表示输入结束
else
{
t=malloc(sizeof(bitree));
t->data=x;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
void preorder(bitree *t)
{
if (t!=NULL)
{
printf("%4d",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(bitree *t)
{
if (t!=NULL)
{
inorder(t->lchild);
printf("%4d",t->data);
inorder(t->rchild);
}
}
void postorder(bitree *t)
{
if (t!=NULL)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%4d",t->data);
}
}
/*-------------------------------------end-----------------------------------------------*/
int main()
{bitree *root;
printf("\n");
root=creat();
printf("\n先序遍历的结果:");
preorder(root);
printf("\n中序遍历的结果:");
inorder(root);
printf("\n后序遍历的结果:");
postorder(root);
printf("\n");
return 0;
}
任务二:
在第一关的基础上增加层次遍历功能,实现二叉树的层次遍历和三种递归遍历
任务描述:
增加层次遍历,实现二叉树的层次遍历和三种递归遍历。
相关知识:
你需要掌握:
1.如何实现层次遍历
2.层次遍历算法实现
- 如何实现二叉树的层次遍历
层次遍历,就是从上到下一层一层的遍历。比如:
思路:
层次遍历时,一个结点先被遍历,它的孩子也先被遍历。因此实现过程要借助队列来完成。思路如下:
-层次遍历算法实现
初始时置空队列
将二叉树根节点入队
当(队列不为空)
{队头元素出队;
访问队头元素;
将队头元素的左右孩子(若非空,如果为空不处理)入队。
}
编程要求:
本关中要用到循环队列结构(用一维数组表示),因此出队操作、入队操作函数要写上。
测试说明:
测试输入:1 2 4 0 0 0 3 0 5 0 0
先序遍历的结果: 1 2 4 3 5
中序遍历的结果: 4 2 1 3 5
后序遍历的结果: 4 2 1 3 5
层次遍历的结果: 1 2 3 4 5
- 示例代码如下:(温馨提示:本文全部代码只在 EduCoder 平台上通过测试,仅供参考,如有运行错误请自行改正)
/*----------------------bitree2.c----------------------------------*/
/*----------------------------本程序只给出了主函数,其他部分都需要补充,请在下面进行补充-----------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#define M 15
typedef struct node
{ int data;
struct node *lchild,*rchild;
} bitree;
bitree *que[M]; /*定义一个指针数组,说明队列中的元素类型为bitree指针类型*/
int front=0,rear=0; /*初始化循环队列*/
/*-----------请在下面区域补充代码---begin---------------------------------------------*/
bitree *creat() //建立二叉树的递归算法
{
bitree *t;
int x;
scanf("%d",&x);
if(x==0)
t=NULL; //以x=0表示输入结束
else
{
t=malloc(sizeof(bitree));
t->data=x;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
void preorder(bitree *t)
{
if (t!=NULL)
{
printf("%4d",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(bitree *t)
{
if (t!=NULL)
{
inorder(t->lchild);
printf("%4d",t->data);
inorder(t->rchild);
}
}
void postorder(bitree *t)
{
if (t!=NULL)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%4d",t->data);
}
}
void enqueue(t) /*把bitree类型的结点*t入队列*/
bitree *t;
{if(front!=(rear+1)%M) /*判断队列是否已满*/
{rear=(rear+1)%M;
que[rear]=t;
}
}
bitree *delqueue()
{
if(front==rear) /*判断队列不为空*/
return NULL;
front=(front+1)%M;
return (que[front]);
}
void levorder(t) //层次遍历二叉树的算法
bitree *t;
{
bitree *p;
if(t!=NULL)
{
enqueue(t); //根结点入队
while (front!=rear) //当前队列不为空时
{
p=delqueue();//输出队头元素,并把其左右孩子入队。此过程一直递归,直到队列为空
printf("%4d",p->data);
if(p->lchild!=NULL)
enqueue(p->lchild);
if(p->rchild!=NULL)
enqueue(p->rchild);
}
}
}
int main()
{bitree *root;
root=creat();
printf("先序遍历的结果:");
preorder(root);
printf("\n中序遍历的结果:");
inorder(root);
printf("\n后序遍历的结果:");
postorder(root);
printf("\n层次遍历的结果:");
levorder(root);
return 0;
}
我把我目前写的关于数据结构 题目 的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。
- 数据结构 习题 第一章 概论
- 数据结构 习题 第二章 线性表 (C语言描述)
- 数据结构 习题 第三章 栈和队列 (C语言描述)
- 数据结构 习题 第四章 串 (C语言描述)
- 数据结构 习题 第五章 多维数组和广义表(C语言描述)
- 数据结构 习题 综合复习
实验: