一、实验目的

1、掌握二叉树的基本特性
2、掌握二叉树的先序、中序、后序的递归遍历算法
3、理解二叉树的先序、中序、后序的非递归遍历算法
4、通过求二叉树的深度、叶子结点数和层序遍历等算法,理解二叉树的基本特性

二、实验内容和要求

1、阅读并运行下面程序,根据输入写出运行结果,并画出二叉树的形态。

#include<stdio.h>
#include<malloc.h>
#define MAX 20
typedef struct BTNode{       /*节点结构声明*/char data ;               /*节点数据*/struct BTNode *lchild;struct BTNode *rchild ;  /*指针*/
}*BiTree;BiTree createBiTree(BiTree t){ /* 先序遍历创建二叉树*/char s;printf("\nplease input data:(exit for #)");s=getchar();if(s=='#'){t=NULL; return t;}t=(BiTree)malloc(sizeof(struct BTNode));if(t==NULL){printf("Memory alloc failure!"); exit(0);}t->data=s;t->lchild=createBiTree(t->lchild); /*递归建立左子树*/t->rchild=createBiTree(t->rchild); /*递归建立右子树*/return t;
}void PreOrder(BiTree p){  /* 先序遍历二叉树*/if ( p!= NULL ) {printf("%c", p->data);PreOrder( p->lchild ) ;PreOrder( p->rchild) ;}
}
void InOrder(BiTree p){  /* 中序遍历二叉树*/if( p!= NULL ) {InOrder( p->lchild ) ;printf("%c", p->data);InOrder( p->rchild) ;}
}
void PostOrder(BiTree p){  /* 后序遍历二叉树*/if ( p!= NULL ) {PostOrder( p->lchild ) ;PostOrder( p->rchild) ;printf("%c", p->data);}
}void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/BiTree stack[MAX],q;int top=0,i;for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/q=p;while(q!=NULL){printf("%c",q->data);if(q->rchild!=NULL) stack[top++]=q->rchild;if(q->lchild!=NULL) q=q->lchild;elseif(top>0) q=stack[--top];else q=NULL;}
}void release(BiTree t){ /*释放二叉树空间*/if(t!=NULL){release(t->lchild);release(t->rchild);free(t);}
}int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);release(t);return 0;
}
运行程序

输入:
ABC##DE#G##F###
运行结果:

画出该二叉树的形态:

2、在上题中补充求二叉树中求结点总数算法(提示:可在某种遍历过程中统计遍历的结点数),并在主函数中补充相应的调用验证正确性。

算法代码:
int CountLeaf(BiTree T)
{if(T){return CountLeaf(T->lchild)+CountLeaf(T->rchild)+1;}elsereturn 0;
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;a=CountLeaf(t);printf("\n");printf("%d",a);release(t);return 0;
}

3、在上题中补充求二叉树中求叶子结点总数算法(提示:可在某种遍历过程中统计遍历的叶子结点数),并在主函数中补充相应的调用验证正确性。

算法代码:
void CountLeaf(BiTree T,int *count)
{if(T){if((!T->lchild)&&(!T->rchild))(*count)++;CountLeaf(T->lchild,count);CountLeaf(T->rchild,count);}
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;CountLeaf(t,&a);printf("\n");printf("%d",a);release(t);return 0;
}

4、在上题中补充求二叉树深度算法,并在主函数中补充相应的调用验证正确性。

算法代码:
int Depth(BiTree T)
{int hl,hr;if(!T)return 0;else{hl=Depth(T->lchild);hr=Depth(T->rchild);if(hl>=hr)return hl+1;elsereturn hr+1;}
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;printf("\n");printf("%d",Depth(t));release(t);return 0;
}

5、补充二叉树层次遍历算法。(提示:利用队列实现)

#include <stdio.h>
#include <stdlib.h>
typedef struct btnode
{char data;struct btnode *lchild,*rchild;
} bitree,*Bitree;
//链队列类型定义
typedef struct LinkQueueNode
{bitree *data;struct LinkQueueNode *next;
} LKQueNode;
typedef struct LKQueue
{LKQueNode *front,*rear;
} LKQue;//初始化队列
void InitQueue(LKQue *LQ)
{LKQueNode *p;p = (LKQueNode*)malloc(sizeof(LKQueNode));LQ->front = p;LQ->rear = p;LQ->front->next = NULL;
}//判断队列是否为空
int EmptyQueue(LKQue *LQ)
{if(LQ->front == LQ->rear)return 1;elsereturn 0;
}//入队列
void EnQueue(LKQue *LQ,Bitree x)
{LKQueNode *p;p = (LKQueNode*)malloc(sizeof(LKQueNode));p->data = x;p->next = NULL;LQ->rear->next = p;LQ->rear = p;
}//出队列
int OutQueue(LKQue *LQ)
{LKQueNode *s;if ( EmptyQueue(LQ)){exit(0);return 0;}else{s = LQ->front->next;LQ->front->next = s->next;if(s->next == NULL)LQ->rear = LQ->front;free(s);return 1;}
}//取队列首元素
Bitree GetHead(LKQue *LQ)
{LKQueNode *p;bitree *q;if(EmptyQueue(LQ))return q;else{p = LQ->front->next;return p->data;}
}//建二叉树
Bitree Initiate()
{char ch;Bitree t;ch = getchar();if(ch == '#')t = NULL;else{t = (Bitree)malloc(sizeof(bitree));t->data = ch;t->lchild = Initiate();t->rchild = Initiate();}return t;
}//层次遍历
void LevelOrder(Bitree bt)
{LKQue Q;Bitree p;InitQueue(&Q);if(bt != NULL){EnQueue(&Q,bt);while(!EmptyQueue(&Q)){p = GetHead(&Q);OutQueue(&Q);printf("%c",p->data); //输出是charif(p->lchild != NULL)EnQueue(&Q,p->lchild);if(p->rchild != NULL)EnQueue(&Q,p->rchild);}}
}
int main()
{Bitree T;printf("按先序序列输入结点序列,'#'代表空:\n");T=Initiate();printf("\n层次遍历序列为:");LevelOrder(T);printf("\n");return 0;
}

6、 补充二叉树中序、后序非递归算法。

#include<stdio.h>
#include<malloc.h>#define MAX 20
typedef struct BTNode        /*节点结构声明*/
{char data ;               /*节点数据*/struct BTNode *lchild;struct BTNode *rchild ;  /*指针*/
}*BiTree;BiTree createBiTree(BiTree t)  /* 先序遍历创建二叉树*/
{char s;printf("\nplease input data:(exit for #)");s=getchar();if(s=='#'){t=NULL;return t;}t=(BiTree)malloc(sizeof(struct BTNode));if(t==NULL){printf("Memory alloc failure!");exit(0);}t->data=s;t->lchild=createBiTree(t->lchild); /*递归建立左子树*/t->rchild=createBiTree(t->rchild); /*递归建立右子树*/return t;
}void PreOrder(BiTree p)   /* 先序遍历二叉树*/
{if ( p!= NULL ){printf("%c", p->data);PreOrder( p->lchild ) ;PreOrder( p->rchild) ;}
}
void InOrder(BiTree p)   /* 中序遍历二叉树*/
{if( p!= NULL ){InOrder( p->lchild ) ;printf("%c", p->data);InOrder( p->rchild) ;}
}
void PostOrder(BiTree p)   /* 后序遍历二叉树*/
{if ( p!= NULL ){PostOrder( p->lchild ) ;PostOrder( p->rchild) ;printf("%c", p->data);}
}void Preorder_n(BiTree p)  /*先序遍历的非递归算法*/
{BiTree stack[MAX],q;int top=0,i;for(i=0; i<MAX; i++) stack[i]=NULL; /*初始化栈*/q=p;while(q!=NULL){printf("%c",q->data);if(q->rchild!=NULL) stack[top++]=q->rchild;if(q->lchild!=NULL) q=q->lchild;else if(top>0) q=stack[--top];else q=NULL;}
}void release(BiTree t)  /*释放二叉树空间*/
{if(t!=NULL){release(t->lchild);release(t->rchild);free(t);}
}
void InordeTraverse(BiTree bt)
{BiTree stack[100], p;int top=0;p=bt;do{while(p!=NULL){stack[top++]=p;p=p->lchild;}if(top>0){p=stack[top-1];printf("%c",stack[top-1]->data);top--;p=p->rchild;}}while(top!=0||p!=NULL);
}/*中序遍历非递归算法*/
void PostorderTraverse(BiTree bt)
{BiTree stack[MAX];int top1 = 0;BiTree cur,top,last = NULL;cur = bt;for(int i = 0; i < MAX; i++)stack[i] = NULL;while(cur || top1){while(cur){stack[++top1] = cur;cur = cur->lchild;}top = stack[top1];if(top->rchild == NULL || top->rchild == last){top1--;printf("%c",top->data) ;last = top;}else{cur = top->rchild;}}
}int main()
{BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);printf("\n\n中序遍历序列(非递归):");InordeTraverse(t);printf("\n\n后序遍历序列(非递归):");PostorderTraverse(t);release(t);return 0;
}

数据结构实验报告三 二叉树相关推荐

  1. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  2. 二叉树的遍历(c语言数据结构实验报告三)

    二叉树的遍历 一.实验目的或任务 二.实验教学基本要求 三.实验教学的内容或要求 1. 编写函数,输入字符序列,建立二叉树的二叉链表 2. 编写函数,实现二叉树的中序递归遍历算法. 3. 编写函数,实 ...

  3. 数据结构实验报告三:教材3.10Josephus(约瑟夫环)问题、多项式乘法问题的求解

    实验三:教材3.10Josephus(约瑟夫环)问题.多项式乘法问题的求解 问题一·教材3.10Josephus问题 1.实验描述 N个人从1到N编号,围坐成一个圆圈.从1号开始传递一个热土豆.经过M ...

  4. C语言南邮数据结构实验报告2,南邮数据结构实验报告.docx

    南邮数据结构实验报告 实验报告 课程名称 实验名称数据结构二叉树基本操作以及哈夫曼编码译码系统 实验时间 指导单位指导教师年月日 学生姓名 学院(系) 班级学号专业 二叉树的基本运算: 一.问题描述 ...

  5. 桂电七院数据结构实验报告一

    顺序表的基本操作 实验内容与步骤 实现顺序表上的插入.删除等操作.调试程序并对相应的输出作出分析:修改输入数据,预期输出并验证输出的结果.加深对有关算法的理解. 步骤: 第一步:定义顺序表的存储结构. ...

  6. 数据结构实验报告(六)

    数据结构实验报告(六) 一.实验名称 实验六  图的实验1--图的邻接矩阵存储实现 二. 实验目的 1.  熟练理解图的相关概念: 2.  掌握图的邻接矩阵的存储方法的实现: 3.  学会图的遍历算法 ...

  7. 农夫过河【数据结构实验报告】

    数据结构实验报告 实验名称:实验三 农夫过河 学号:*** 姓名:gnosed 实验日期:2017.10.30 一.实验目的 1.进一步掌握队列的使用 2.会使用队列进行农夫过河解的搜索 二.实验具体 ...

  8. 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四

    北京理工大学数据结构实验报告实验四 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 <数据结构与算法设计>实验报告--实 ...

  9. 数据结构实验报告(一)

    数据结构实验报告(一) 一.实验名称 实验一  线性表的基本操作实现及其应用 二.实验目的 1.熟练掌握线性表的结构特点,掌握顺序表的基本操作. 2.巩固 C++相关的程序设计方法与技术. 3.学会使 ...

最新文章

  1. 解密ATS 4.2.3的缓存状态密码
  2. hadoop中的序列化与Writable类
  3. HP QC IE11不支持( win7 64位 无法安装)解决方法
  4. hibernate实体的几种状态
  5. [WPF]程序随系统自启动
  6. FlexPaper 2.2.1介绍与提取嵌入的文档
  7. 进程锁 读写文件的小例子 C++代码
  8. Linux 中文无法显示或显示方块
  9. 青蛙换位java_青蛙换位
  10. C#:const 和readonly的区别
  11. kubernetes视频教程笔记 (35)-使用Helm部署metrics-server
  12. Windows10删除hiberfil.sys
  13. Java 设计员工类Employee,假设现有教师、科学家2种员工类型,根据要求求出各人的全年收入。
  14. 《数据之美》读书笔记
  15. 《乔布斯转》读书笔记
  16. 油罐车起火造成损失和伤亡?资产监测设备可远程监测油罐车运输!
  17. python里raise是什么意思_python raise有什么用
  18. 『阶段总结』研一目标
  19. [转] 找到一个与VR相关的博客
  20. 几篇人工智能/思考的书籍

热门文章

  1. Android开启手电筒功能(完美适配Android4x,5x,6x)
  2. 终身学习--启程篇:清华大学 《ARM控制器与嵌入式系统》
  3. Linux用户和组:linux用户和组及权限讲解
  4. 中国女排3-0胜意大利,排名上升,下次对阵美国队做了哪些准备?
  5. 迅为RK3568开发板Ubuntu系统编写运行Qt工程
  6. Java实现 LeetCode 297 二叉树的序列化与反序列化
  7. C#判断中文和英文字符长度
  8. 无纸化会议交互系统的后台管理
  9. 阿里巴巴Java开发命名规范
  10. 20200422华为笔试