二叉树的基本运算实验报告C语言,数据结构实验三二叉树基本操作及运算实验报告...

41528d3028836879cd698677c3999917.gif数据结构实验三二叉树基本操作及运算实验报告

《数据结构与数据库》实验报告实验题目二叉树的基本操作及运算一、 需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为 2 的结点数目、度为 2 的结点数目,以及二叉树常用运算。问题分析:二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该:1、 建立二叉树;2、 通过递归方法来遍历(先序、中序和后序)二叉树;3、 通过队列应用来实现对二叉树的层次遍历;4、 借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;5、 运用广义表对二叉树进行广义表形式的打印。算法规定:输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为 2 的结点数目、度为 2 的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。测试数据:输 入 一:ABC□□DE □G □□F□□□ (以□表示空格),查找 5,删除 E预测结果:先序遍历 ABCDEGF中序遍历 CBEGDFA后序遍历 CGEFDBA层次遍历 ABCDEFG广义表打印 A(B(C,D(E(,G),F) ) )叶子数 3 深度 5 宽度 2 非空子孙数 6 度为 2 的数目 2 度为 1 的数目 2查找 5,成功,查找的元素为 E删除 E 后,以广义表形式打印 A(B(C,D(,F) ) )输 入 二:ABD□□EH□□□CF□G □□□ (以□表示空格),查找 10,删除 B预测结果:先序遍历 ABDEHCFG中序遍历 DBHEAGFC后序遍历 DHEBGFCA层次遍历 ABCDEFHG广义表打印 A(B(D,E(H)),C(F(,G)))叶子数 3 深度 4 宽度 3 非空子孙数 7 度为 2 的数目 2 度为 1 的数目 3查找 10,失败。删除 B 后,以广义表形式打印 A(,C(F(,G) ) )二、 概要设计程序中将涉及下列两个抽象数据类型:一个是二叉树,一个是队列。1、设定“二叉树”的抽象数据类型定义:ADT BiTree{数据对象 D:D 是具有相同特性的数据元素的集合。数据关系 R:若 ,则 ,称 BiTree 为空二叉树;若 ,则 ,H 是如下二元关系:(1) 在 D 中存在唯一的称为根的数据元素 root,它在关系 H 下无前驱;(2) 若 则存在 且 ; ,rot,rlDrotrl(3) 若 则 中存在唯一的元素 , 且存在 上的关系,ll lxtll若 则 中存在唯一的元素 , 且存在 上的;Hl,rrDr,,xotrrD关系 ;rlrlr Hxotxt,,(4) 是一棵符合本定义的二叉树,称为根的左子树, 是一棵符合llD, r,本定义的二叉树,称为根的有字树基本操作:CreateBiTree //队列中存储的元素类型struct QNode *next; //指向二叉树结点的指针 }QNode,*Queueptr;typedef struct{Queueptr front; //队列的队头指针Queueptr rear; //队列的队尾指针}LinkQueue;算法描述:为了对二叉树进行层次遍历,需要“先访问的结点,其孩子结点必然也先访问” ,故需运用到队列。而考虑到层次遍历对队列操作的需要,只需进行队列的初始化,入队和出队以及检查队列是否为空。伪码算法:void InitQueue(LinkQueue *Q){//初始化队列申请一个结点Q-front=Q-rear=(Queueptr)malloc(sizeof(QNode));if(!Q-front)exit(1);//存储分配失败处理Q-front-next=NULL;//构成带头结点里的空链队列}void EnQueue(LinkQueue *Q,BiTree e){//插入元素为 e 为 Q 的队尾元素Queueptr q;q=(Queueptr)malloc(sizeof(QNode));if(!q)exit(1);q-data=e;q-next=NULL;Q-rear-next=q; //元素 e 的结点入列Q-rear=q;}BiTree DeQueue(LinkQueue *Q){//从队列中删除队头元素,并直接返回给调用的主函数Queueptr p;BiTree q;if(Q-front==Q-rear){//队列为空printf(“ERROR!\n“);exit(1);}p=Q-front-next;q=p-data;Q-front-next=p-next; //删除该结点if(Q-rear==p)Q-rear=Q-front;free(p);return q;//返回队头元素}int QueueEmpty(LinkQueue *Q){//检查队列是否为空,若为空则返回真值,否则返回 0if(Q-front==Q-rear)return 1;elsereturn 0;}3、二叉树的建立与基本操作typedef struct BiTNode{TElemType data; //二叉树结点存储的元素类型struct BiTNode *lchild,*rchild; //二叉树左右孩子指针}BiTNode,*BiTree;算法分析:二叉树的基本操作是本程序的核心,考虑到二叉树的定义就是采用递归定义,所以很容易想到对二叉树的操作可通过递归调用来实现。1)二叉树的遍历算法描述:二叉树中常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就需要遍历二叉树。即要求按某条路径寻访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。回顾二叉树的递归定义可知,二叉树是由 3 个基本单元组成:根节点、左子树和右子树。因此,若能依次遍历这三部分,便是遍历了整棵二叉树。如果以 L、D、R 分别表示遍历左子树、访问根结点和遍历右子树,则可有 DLR、LDR、LRD、DRL、RDL、RLD 这 6 种遍历二叉树的方案。若限定先右后左,则只有前三种情况,分别称之为先(根)序遍历。中(根)序遍历和后(根)序遍历。基于二叉树的递归定义,可得下述遍历二叉树的递归定义算法。先序遍历二叉树的操作定义:若二叉树为空,则空操作;否则(1) 访问根结点;(2) 先序遍历左子树;(3) 先序遍历右子树。伪码算法:void PreOderTraverse(BiTree T){//采用二叉链表存储结构if(T){putchar(T-data);//最简单的访问结点法,输出结点元素,这里先访问根结点PreOderTraver

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值