实验六 二叉树实验报告(1)

时间:2024.4.20

实验四 二叉树的操作

班级:计算机1002班

姓名:**

学号:**

完成日期:20XX.6.14

题目:对于给定的一二叉树,实现各种约定的遍历。

一、实验目的:

(1)掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法;

(2)掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍历算法的递归实现和非递归实现。

二、实验内容:构造二叉树,再实现二叉树的先序、中序、后序遍历,最后统计二叉树的深度。

三、实验步骤:

(一) 需求分析

1. 二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。因为树的每一个左右子树又是一颗二叉树,所以用递归的方法来建立其左右子树。二叉树的遍历是一种把二叉树的每一个节点访问并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句来实现。

2.程序的执行命令为:

1)构造结点类型,然后创建二叉树。

2)根据提示,从键盘输入各个结点。

3)通过选择一种方式(先序、中序或者后序)遍历。

4)输出结果,结束。

(二)概要设计

1.二叉树的二叉链表结点存储类型定义

typedef struct Node

{

DataType data;

struct Node *LChild;

struct Node *RChild;

}BitNode,*BitTree;

2.建立如下图所示二叉树:void CreatBiTree(BitTree *bt)用扩展先序遍历序列创建二叉树,如果是当前树根置为空,否则申请一个新节点。

3.本程序包含四个模块

1) 主程序模块:

2)先序遍历模块

3)中序遍历模块

4)后序遍历模块

4.模块调用关系:

主程序模块

实验六二叉树实验报告1

(三)详细设计

1.建立二叉树存储类型

//==========构造二叉树=======

void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是当前树根置为空,否则申请一个新节点//

{

char ch;

ch=getchar();

if(ch=='.')*bt=NULL;

else

{

*bt=(BitTree)malloc(sizeof(BitNode));//申请一段关于该节点类型的存储空间

(*bt)->data=ch; //生成根结点

CreatBiTree(&((*bt)->LChild)); //构造左子树

CreatBiTree(&((*bt)->RChild)); //构造右子树

}

}

2. 编程实现以上二叉树的前序、中序和后序遍历操作,输出遍历序列

1)先序遍历二叉树的递归算法如下:

void PreOrder(BitTree root)

{

if (root!=NULL)

{

Visit(root ->data);

PreOrder(root ->LChild); //递归调用核心

PreOrder(root ->RChild);

}

}

2)中序遍历二叉树的递归算法如下:

void InOrder(BitTree root)

{

if (root!=NULL)

{

InOrder(root ->LChild);

Visit(root ->data);

InOrder(root ->RChild);

}

}

3)后序遍历二叉树的递归算法如下:

void PostOrder(BitTree root)

{

if(root!=NULL)

{

PostOrder(root ->LChild);

PostOrder(root ->RChild);

Visit(root ->data);

}

}

4)计算二叉树的深度算法如下:

int PostTreeDepth(BitTree bt) //求二叉树的深度

{

int hl,hr,max;

if(bt!=NULL)

{

hl=PostTreeDepth(bt->LChild); //求左子树的深度

hr=PostTreeDepth(bt->RChild); //求右子树的深度

max=hl>hr?hl:hr; //得到左、右子树深度较大者

return(max+1); //返回树的深度

}

else return(0); //如果是空树,则返回0

}

四、调试分析及测试结果

1. 进入演示程序后的显示主界面:

请输入二叉树中的元素;

先序、中序和后序遍历分别输出结果。

2.测试结果

以扩展先序遍历序列输入,其中.代表空子树:ABC..DE.G..F…

先序遍历序列为:ABCDEGF

中序遍历序列为:CBEGDFA

后序遍历序列为:CGEFDBA

此二叉树的深度为:5

3.程序运行结果

1)输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树),显示截图为:

实验六二叉树实验报告1

图一

2)输出结果,显示界面为:

实验六二叉树实验报告1

图二

4.调试分析:

本程序通过分别调用先序遍历、中序遍历以及后序遍历函数对二叉树中的元素进行遍历,整个程序基本满足实验要求,但是在一些细节问题上面还是存在缺陷,比如大小写字母不同也会导致程序无法运行,这就需要我们在处理问题上认真细致,还有就是程序并不是很完善,总之,我会在今后更加努力,是程序更完美。

六、实验总结

1. 二叉树对于进行表达式的前缀,中缀和后缀的表示有明显的优势,既方便,又容易理解。其先序,中序和后序分别对应这表达式的前缀,中缀和后缀。

2. 在建树与进行树的遍历的时候一定要理解其建树与遍历的整个过程。不然就会连为什么这样做都不知道。在遍历树的时候最常用到的就是栈的结构了(非递归)。

3.本次实验让我更加了解了哈夫曼树的构造和生成方法,以及如何用顺序结构来存储哈夫曼树及构树过程的信息,如何进行编码、译码。也感知到模块程序设计在大程序设计使用中的普遍性,该实验是最好的证明,通过模块程序设计,能使程序可读可写性明显加强。

通过本次实验,使我初步掌握了二叉树的结构特性以及各种存储的结构的特点和适用范围,掌握了哈夫曼树的定义和思想,初步掌握了用凹入法显示树。不过程序仍有树的显示不够完善的缺点,在今后的学习中,我会不断学习,在学习中注意改变。

附录

源程序清单:

#include<stdio.h>

#include<stdlib.h>

#include <malloc.h>

#include <conio.h>

typedef int DataType;

typedef struct Node //创建结点类型结构体

{

DataType data;

struct Node *LChild;

struct Node *RChild;

}BitNode,*BitTree;

void CreatBiTree(BitTree *bt) //用扩展先序遍历序列创建二叉树,如果是当前树根置为空,否则申请一个新节点//

{

char ch;

ch=getchar();

if(ch=='.')*bt=NULL;

else

{

*bt=(BitTree)malloc(sizeof(BitNode));

(*bt)->data=ch;

CreatBiTree(&((*bt)->LChild));

CreatBiTree(&((*bt)->RChild));

}

}

void visit(char ch)//访问根节点

{

printf("%c",ch);

}

void PreOrder(BitTree root) //先序遍历二叉树的递归算法

{

if (root!=NULL)

{

Visit(root ->data);

PreOrder(root ->LChild);

PreOrder(root ->RChild);

}

}

void InOrder(BitTree root) //中序遍历二叉树的递归算法

{

if (root!=NULL)

{

InOrder(root ->LChild);

Visit(root ->data);

InOrder(root ->RChild);

}

}

void PostOrder(BitTree root) //后序遍历求二叉树的递归算法

{

if(root!=NULL)

{

PostOrder(root ->LChild);

PostOrder(root ->RChild);

Visit(root ->data);

}

}

int PostTreeDepth(BitTree bt) //求二叉树的深度

{

int hl,hr,max;

if(bt!=NULL)

{

hl=PostTreeDepth(bt->LChild); //求左子树的深度

hr=PostTreeDepth(bt->RChild); //求右子树的深度

max=hl>hr?hl:hr; //得到左、右子树深度较大者

return(max+1); //返回树的深度

}

else return(0); //如果是空树,则返回0

}

void main()

{ BitTree T;

int h;

int layer;

int treeleaf;

layer=0;

printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n"); CreatBiTree(&T);

printf("先序遍历序列为:");

PreOrder(T);

printf("\n中序遍历序列为:");

InOrder(T);

printf("\n后序遍历序列为:");

PostOrder(T);

h=PostTreeDepth(T);

printf("\n");

printf("此二叉树的深度为:%d\n",h);}


第二篇:二叉树链式存储结构 第六章实验报告


实验名称:二叉树链式存储结构

实验类型:验证性实验

班级:**

学号:***

姓名:

实验日期:20XX.5.27

1. 问题描述

二叉链表的C语言描述;

基本运算的算法——建立二叉链表、先序遍历二叉树、中序遍历二叉树、后序遍历二叉树、后序遍历求二叉树深度。

2. 数据结构设计

typedef struct Bitnode

{ char data;

struct Bitnode *lchild,*rchild;

}Bitnode,*Bitree;

3. 算法设计

建立二叉链表:void createBitree(Bitree &T)

{

char ch;

if((ch=getchar())=='#') T=NULL;

else{T=(Bitnode*)malloc(sizeof(Bitnode));

T->data=ch;

createBitree(T->lchild);

createBitree(T->rchild);

}

}

先序遍历二叉树:void preorder(Bitree &T)

{

if(T!=NULL)

{printf("%c",T->data);

preorder(T->lchild);

preorder(T->rchild);}}

中序遍历二叉树:void inorder(Bitree &T)

{if(T!=NULL)

{ inorder(T->lchild);

printf("%c",T->data);

inorder(T->rchild);

}

后序遍历二叉树:void postorder(Bitree &T)

{

if(T!=NULL)

{postorder(T->lchild);

postorder(T->rchild);

printf("%c",T->data);

}

}//后序遍历

后序遍历求二叉树深度:int Depth(Bitree &T)

{//返回深度

int d,dl,dr;

if(!T) d=0;

else {dl=Depth(T->lchild);

dr=Depth(T->rchild);

d=1+(dl>dr?dl:dr) ;

}

return d;

}

4.运行、测试与分析

运行程序,显示菜单,

(1) 如图1.1:

二叉树链式存储结构第六章实验报告

图1.1

(2) 结果图1.2:

二叉树链式存储结构第六章实验报告

图1.2

5.实验收获及思考

在实验过程中学会了调试程序,对于二叉树的相关知识有了不同的认识,不仅仅是抽象上的了。更重要的是懂得了自己写程序的重要性,慢慢养成习惯。

6.源代码

#include<stdio.h>

#include<stdlib.h>

typedef struct Bitnode

{ char data;

struct Bitnode *lchild,*rchild;

}Bitnode,*Bitree;

//建立二叉树

void createBitree(Bitree &T)

{

char ch;

if((ch=getchar())=='#') T=NULL;

else{T=(Bitnode*)malloc(sizeof(Bitnode));

T->data=ch;

createBitree(T->lchild);

createBitree(T->rchild);

}

}

//先序遍历输出结点

void preorder(Bitree &T)

{

if(T!=NULL)

{printf("%c",T->data);

preorder(T->lchild);

preorder(T->rchild);

}

}

void inorder(Bitree &T)

{if(T!=NULL)

{ inorder(T->lchild);

printf("%c",T->data);

inorder(T->rchild);

}

}//中序遍历

void postorder(Bitree &T)

{

if(T!=NULL)

{postorder(T->lchild);

postorder(T->rchild);

printf("%c",T->data);

}

}//后序遍历

//后序遍历求深度

int Depth(Bitree &T)

{//返回深度

int d,dl,dr;

if(!T) d=0;

else {dl=Depth(T->lchild);

dr=Depth(T->rchild);

d=1+(dl>dr?dl:dr) ;

}

return d;

}

int main()

{

printf("**********二叉树链表存储********");

printf("\n1.建立二叉链表\n2.先序遍历\n3.中序遍历\n4.后续遍历\n5.后序遍历求深度\n");

printf("例子:abc##de#g##f###\n");

Bitree T;

printf("输入树的结点:\n");

createBitree(T);

printf("先序为:\n");

preorder(T);

printf("\n中序遍历为:\n");

inorder(T) ;

printf("\n后序为:\n");

postorder( T);

printf("后序求深度:%d\n",Depth(T));

system("pause");

}

更多相关推荐:
二叉树实验报告

实验六树和二叉树的操作一实验目的1进一步掌握树的结构及非线性特点递归特点和动态性2进一步巩固对指针的使用和二叉树的三种遍历方法建立方法二实验内容二叉树的实现和运算三实验要求1用CC完成算法设计和程序设计并上机调...

树和二叉树实验报告

树和二叉树一实验目的1掌握二叉树的结构特征以及各种存储结构的特点及适用范围2掌握用指针类型描述访问和处理二叉树的运算二实验要求1认真阅读和掌握本实验的程序2上机运行本程序3保存和打印出程序的运行结果并结合程序进...

二叉树基本操作--实验报告

宁波工程学院电信学院计算机教研室实验报告一实验目的1熟悉二叉树树的基本操作2掌握二叉树的实现以及实际应用3加深二叉树的理解逐步培养解决实际问题的编程能力二实验环境1台WINDOWS环境的PC机装有VisualC...

二叉树实验报告

二叉树实验报告问题描述1问题描述用先序递归过程建立二叉树存储结构二叉链表输入数据按先序遍历所得序列输入当某结点左子树或右子树为空时输入号如输入abcde得到的二叉树为编写递归算法计算二叉树中叶子结点的数目按凹入...

二叉树实验报告

数据结构课程设计报告专业计算机科学与技术班级3班姓名学号指导教师起止时间20xx1220xx1课程设计二叉树一任务描述二叉树的中序前序后序的递归非递归遍历算法应包含建树的实现任务设计一个程序实现二叉树的前序中序...

二叉树的遍历实验报告

二叉树的遍历实验报告一需求分析在二叉树的应用中常常要求在树中查找具有某种特征的结点或者对树中全部结点逐一进行某种处理这就是二叉树的遍历问题对二叉树的数据结构进行定义建立一棵二叉树然后进行各种实验操作二叉树是一个...

数据结构C二叉树实验报告

北京林业大学12学年13学年第1学期数据结构实验报告书专业自动化班级111姓名宁友菊学号111044120实验地点B2机房任课教师孟伟实验题目二叉树的基本操作实验环境VisualC实验目的1掌握二叉树的定义2掌...

二叉树实验报告

数据结构实验报告专业班级计算机科学与技术姓名学号一实验目的和要求上机学习二叉树二实验内容实现二叉树的各项算法并掌握其用法如二叉树的构造先中后序遍历层次遍历等等三实验过程31设计算法1二叉树的构造通过对二叉树的先...

二叉树实验报告

二叉树实验报告题目以三元组形式输入任意二叉树以大写字母表示结点求以任意一选定结点为子树的深度1编程思路概述实验采用二叉树的数据结构以二叉链表存储三元组形式输入建立二叉树本实验中用户输入选择结点后程序调用BiTN...

二叉树实验报告

一二叉树基础1定义有且仅有一个根结点除根节点外每个结点只有一个父结点最多含有两个子节点子节点有左右之分2存储结构二叉树的存储结构可以采用顺序存储也可以采用链式存储其中链式存储更加灵活在链式存储结构中与线性链表类...

树和二叉树的实验报告

数据结构实验报告题目树和二叉树一用二叉树来表示代数表达式一需求分析输入一个正确的代数表达式包括数字和用字母表示的数运算符号及括号系统根据输入的表达式建立二叉树按照先括号里面的后括号外面的先乘后除的原则每个节点里...

二叉树的建立及遍历实验报告

实验三二叉树的建立及遍历实验目的1掌握利用先序序列建立二叉树的二叉链表的过程2掌握二叉树的先序中序和后序遍历算法实验内容1编写程序实现二叉树的建立并实现先序中序和后序遍历如输入先序序列abcde则建立如下图所示...

二叉树实验报告(43篇)