数据结构 实验四 二叉树的操作

二叉树的操作

任务一
创建一颗二叉树,并对其进行前序、中序、后序遍历

任务描述
本关任务:创建一颗二叉树,并对其进行前序、中序、后序递归遍历。

相关知识
为了完成本关任务,你需要掌握:
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;
}

我把我目前写的关于数据结构 题目 的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。

实验:

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值