实验报告(二叉树)

时间:2024.4.20

仲恺农业工程学院实验报告纸

信息科学与技术(院、系)计算机专业144数据结构与算法

学号201420224417 姓名刘智龙 实验日期 2015.12.8 教师评定

一、实验目的

1、掌握二叉树的特点,以及的二叉链表存储结构。

2、熟练掌握二叉树的各种操作,如建立、遍历、查找和输出。

3、利用已经掌握的知识进行实际应用。

二、实验环境

1) 硬件:每个学生需配备计算机一台,操作系统:Windows2000/XP。

2) 软件:visual c++6.0。

三、实验题目和实验内容

实验题目:二叉树操作及应用

实验内容:

1、基本题:教材实验7.1、实验7.2、实验7.3的(1)和(2)

2、附加题:实验7.6、实验7.8、

四、实验项目的程序结构(包含的各个文件中的函数调用功能描述、程序中的函数调用关系图)(可写可不写)

五、实验数据和实验结果(程序运行结果的截图)

实验7.1结果:

实验7.2结果:

实验7.3结果:

六、附录(程序代码)

实验7.1源代码:

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct node

{

ElemType data; //数据元素

struct node *lchild; //指向左孩子

struct node *rchild; //指向右孩子

} BTNode;

void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链

{

BTNode *St[MaxSize],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL; //建立的二叉树初始时为空

ch=str[j];

while (ch!='\0') //str未扫描完时循环

{

switch(ch)

{

case '(':top++;St[top]=p;k=1; break; //为左节点

case ')':top--;break;

case ',':k=2; break; //为右节点

default:p=(BTNode *)malloc(sizeof(BTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if (b==NULL) //p指向二叉树的根节点

b=p;

else //已建立二叉树根节点

{

switch(k)

{

case 1:St[top]->lchild=p;break;

case 2:St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}

BTNode *FindNode(BTNode *b,ElemType x) //返回data域为x的节点指针

{

BTNode *p;

if (b==NULL)

return NULL;

else if (b->data==x)

return b;

else

{

p=FindNode(b->lchild,x);

if (p!=NULL)

return p;

else

return FindNode(b->rchild,x);

}

}

BTNode *LchildNode(BTNode *p) //返回*p节点的左孩子节点指针

{

return p->lchild;

}

BTNode *RchildNode(BTNode *p) //返回*p节点的右孩子节点指针

{

return p->rchild;

}

int BTNodeDepth(BTNode *b) //求二叉树b的深度

{

int lchilddep,rchilddep;

if (b==NULL)

return(0); //空树的高度为0

else

{

lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep

rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddep

return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);

}

}

void DispBTNode(BTNode *b) //以括号表示法输出二叉树

{

if (b!=NULL)

{

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

if (b->lchild!=NULL || b->rchild!=NULL)

{

printf("(");

DispBTNode(b->lchild);

if (b->rchild!=NULL) printf(",");

DispBTNode(b->rchild);

printf(")");

}

}

}

int BTWidth(BTNode *b) //求二叉树b的宽度

{

struct

{

int lno; //节点的层次编号

BTNode *p; //节点指针

} Qu[MaxSize]; //定义顺序非循环队列

int front,rear; //定义队首和队尾指针

int lnum,max,i,n;

front=rear=0; //置队列为空队

if (b!=NULL)

{

rear++;

Qu[rear].p=b; //根节点指针入队

Qu[rear].lno=1; //根节点的层次编号为1

while (rear!=front) //队列不为空

{

front++;

b=Qu[front].p; //队头出队

lnum=Qu[front].lno;

if (b->lchild!=NULL) //左孩子入队

{

rear++;

Qu[rear].p=b->lchild;

Qu[rear].lno=lnum+1;

}

if (b->rchild!=NULL) //右孩子入队

{

rear++;

Qu[rear].p=b->rchild;

Qu[rear].lno=lnum+1;

}

}

max=0;lnum=1;i=1;

while (i<=rear)

{

n=0;

while (i<=rear && Qu[i].lno==lnum)

{

n++;i++;

}

lnum=Qu[i].lno;

if (n>max) max=n;

}

return max;

}

else

return 0;

}

int Nodes(BTNode *b) //求二叉树b的节点个数

{

int num1,num2;

if (b==NULL)

return 0;

else if (b->lchild==NULL && b->rchild==NULL)

return 1;

else

{

num1=Nodes(b->lchild);

num2=Nodes(b->rchild);

return (num1+num2+1);

}

}

int LeafNodes(BTNode *b) //求二叉树b的叶子节点个数

{

int num1,num2;

if (b==NULL)

return 0;

else if (b->lchild==NULL && b->rchild==NULL)

return 1;

else

{

num1=LeafNodes(b->lchild);

num2=LeafNodes(b->rchild);

return (num1+num2);

}

}

void DestroyBTNode(BTNode *&b)

{

if (b!=NULL)

{

DestroyBTNode(b->lchild);

DestroyBTNode(b->rchild);

free(b);

}

}

void main()

{ BTNode *b,*p,*lp,*rp;;

CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

printf("二叉树的基本运算如下:\n");

printf(" (1)输出二叉树:");DispBTNode(b);printf("\n");

printf(" (2)H节点:");

p=FindNode(b,'H');

if (p!=NULL)

{ lp=LchildNode(p);

if (lp!=NULL)

printf("左孩子为%c ",lp->data);

else

printf("无左孩子 ");

rp=RchildNode(p);

if (rp!=NULL)

printf("右孩子为%c",rp->data);

else

printf("无右孩子 ");

}

printf("\n");

printf(" (3)二叉树b的深度:%d\n",BTNodeDepth(b));

printf(" (4)二叉树b的宽度:%d\n",BTWidth(b));

printf(" (5)二叉树b的节点个数:%d\n",Nodes(b));

printf(" (6)二叉树b的叶子节点个数:%d\n",LeafNodes(b));

printf(" (7)释放二叉树b\n");

DestroyBTNode(b);

}

实验7.2源代码:

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct node

{

ElemType data; //数据元素

struct node *lchild; //指向左孩子

struct node *rchild; //指向右孩子

} BTNode;

void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链

{

BTNode *St[MaxSize],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL; //建立的二叉树初始时为空

ch=str[j];

while (ch!='\0') //str未扫描完时循环

{

switch(ch)

{

case '(':top++;St[top]=p;k=1; break; //为左节点

case ')':top--;break;

case ',':k=2; break; //为右节点

default:p=(BTNode *)malloc(sizeof(BTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if (b==NULL) //p指向二叉树的根节点

b=p;

else //已建立二叉树根节点

{

switch(k)

{

case 1:St[top]->lchild=p;break;

case 2:St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}

void DispBTNode(BTNode *b) //以括号表示法输出二叉树

{

if (b!=NULL)

{

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

if (b->lchild!=NULL || b->rchild!=NULL)

{

printf("(");

DispBTNode(b->lchild);

if (b->rchild!=NULL) printf(",");

DispBTNode(b->rchild);

printf(")");

}

}

}

void DestroyBTNode(BTNode *&b)

{

if (b!=NULL)

{

DestroyBTNode(b->lchild);

DestroyBTNode(b->rchild);

free(b);

}

}

void PreOrder(BTNode *b) //先序遍历的递归算法

{

if (b!=NULL)

{

printf("%c ",b->data); //访问根节点

PreOrder(b->lchild); //递归访问左子树

PreOrder(b->rchild); //递归访问右子树

}

}

void PreOrder1(BTNode *b)

{

BTNode *St[MaxSize],*p;

int top=-1;

if (b!=NULL)

{

top++; //根节点入栈

St[top]=b;

while (top>-1) //栈不为空时循环

{

p=St[top]; //退栈并访问该节点

top--;

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

if (p->rchild!=NULL) //右孩子入栈

{

top++;

St[top]=p->rchild;

}

if (p->lchild!=NULL) //左孩子入栈

{

top++;

St[top]=p->lchild;

}

}

printf("\n");

}

}

void InOrder(BTNode *b) //中序遍历的递归算法

{

if (b!=NULL)

{

InOrder(b->lchild); //递归访问左子树

printf("%c ",b->data); //访问根节点

InOrder(b->rchild); //递归访问右子树

}

}

void InOrder1(BTNode *b)

{

BTNode *St[MaxSize],*p;

int top=-1;

if (b!=NULL)

{

p=b;

while (top>-1 || p!=NULL)

{

while (p!=NULL)

{

top++;

St[top]=p;

p=p->lchild;

}

if (top>-1)

{

p=St[top];

top--;

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

p=p->rchild;

}

}

printf("\n");

}

}

void PostOrder(BTNode *b) //后序遍历的递归算法

{

if (b!=NULL)

{

PostOrder(b->lchild); //递归访问左子树

PostOrder(b->rchild); //递归访问右子树

printf("%c ",b->data); //访问根节点

}

}

void PostOrder1(BTNode *b)

{

BTNode *St[MaxSize];

BTNode *p;

int flag,top=-1; //栈指针置初值

if (b!=NULL)

{

do

{

while (b!=NULL) //将t的所有左节点入栈

{

top++;

St[top]=b;

b=b->lchild;

}

p=NULL; //p指向当前节点的前一个已访问的节点

flag=1;

while (top!=-1 && flag)

{

b=St[top]; //取出当前的栈顶元素

if (b->rchild==p) //右子树不存在或已被访问,访问之

{

printf("%c ",b->data); //访问*b节点

top--;

p=b; //p指向则被访问的节点

}

else

{

b=b->rchild; //t指向右子树

flag=0;

}

}

} while (top!=-1);

printf("\n");

}

}

void TravLevel(BTNode *b)

{

BTNode *Qu[MaxSize]; //定义循环队列

int front,rear; //定义队首和队尾指针

front=rear=0; //置队列为空队列

if (b!=NULL)

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

rear++; //节点指针进入队列

Qu[rear]=b;

while (rear!=front) //队列不为空

{

front=(front+1)%MaxSize;

b=Qu[front]; //队头出队列

if (b->lchild!=NULL) //输出左孩子,并入队列

{

printf("%c ",b->lchild->data);

rear=(rear+1)%MaxSize;

Qu[rear]=b->lchild;

}

if (b->rchild!=NULL) //输出右孩子,并入队列

{

printf("%c ",b->rchild->data);

rear=(rear+1)%MaxSize;

Qu[rear]=b->rchild;

}

}

printf("\n");

}

void main()

{

BTNode *b;

CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

printf("二叉树b:");DispBTNode(b);printf("\n");

printf("层次遍历序列:");

TravLevel(b);

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

printf(" 递归算法:");PreOrder(b);printf("\n");

printf(" 非递归算法:");PreOrder1(b);

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

printf(" 递归算法:");InOrder(b);printf("\n");

printf(" 非递归算法:");InOrder1(b);

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

printf(" 递归算法:");PostOrder(b);printf("\n");

printf(" 非递归算法:");PostOrder1(b);

DestroyBTNode(b);

}

实验7.3源代码:

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct node

{

ElemType data; //数据元素

struct node *lchild; //指向左孩子

struct node *rchild; //指向右孩子

} BTNode;

void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链

{

BTNode *St[MaxSize],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL; //建立的二叉树初始时为空

ch=str[j];

while (ch!='\0') //str未扫描完时循环

{

switch(ch)

{

case '(':top++;St[top]=p;k=1; break; //为左节点

case ')':top--;break;

case ',':k=2; break; //为右节点

default:p=(BTNode *)malloc(sizeof(BTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if (b==NULL) //p指向二叉树的根节点

b=p;

else //已建立二叉树根节点

{

switch(k)

{

case 1:St[top]->lchild=p;break;

case 2:St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}

void DispBTNode(BTNode *b) //以括号表示法输出二叉树

{

if (b!=NULL)

{

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

if (b->lchild!=NULL || b->rchild!=NULL)

{

printf("(");

DispBTNode(b->lchild);

if (b->rchild!=NULL) printf(",");

DispBTNode(b->rchild);

printf(")");

}

}

}

void DestroyBTNode(BTNode *&b)

{

if (b!=NULL)

{

DestroyBTNode(b->lchild);

DestroyBTNode(b->rchild);

free(b);

}

}

void AllPath(BTNode *b)

{

struct snode

{

BTNode *node; //存放当前节点指针

int parent; //存放双亲节点在队列中的位置

} Qu[MaxSize]; //定义顺序队列

int front,rear,p; //定义队头和队尾指针

front=rear=-1; //置队列为空队列

rear++;

Qu[rear].node=b; //根节点指针进入队列

Qu[rear].parent=-1; //根节点没有双亲节点

while (front

{

front++;

b=Qu[front].node; //队头出队列

if (b->lchild==NULL && b->rchild==NULL) //*b为叶子节点

{

printf(" %c到根节点逆路径:",b->data);

p=front;

while (Qu[p].parent!=-1)

{

printf("%c ",Qu[p].node->data);

p=Qu[p].parent;

}

printf("%c\n",Qu[p].node->data);

}

if (b->lchild!=NULL) //左孩子入队列

{

rear++;

Qu[rear].node=b->lchild;

Qu[rear].parent=front;

}

if (b->rchild!=NULL) //右孩子入队列

{

rear++;

Qu[rear].node=b->rchild;

Qu[rear].parent=front;

}

}

}

void AllPath1(BTNode *b,ElemType path[],int pathlen)

{

int i;

if (b!=NULL)

{

if (b->lchild==NULL && b->rchild==NULL) //*b为叶子节点

{

printf(" %c到根节点逆路径: %c ",b->data,b->data);

for (i=pathlen-1;i>=0;i--)

printf("%c ",path[i]);

printf("\n");

}

else

{

path[pathlen]=b->data; //将当前节点放入路径中

pathlen++; //路径长度增1

AllPath1(b->lchild,path,pathlen); //递归扫描左子树

AllPath1(b->rchild,path,pathlen); //递归扫描右子树

pathlen--; //恢复环境

}

}

}

void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen)

{

int i;

if (b==NULL)

{

if (pathlen>longpathlen) //若当前路径更长,将路径保存在longpath中

{

for (i=pathlen-1;i>=0;i--)

longpath[i]=path[i];

longpathlen=pathlen;

}

}

else

{

path[pathlen]=b->data; //将当前节点放入路径中

pathlen++; //路径长度增1

LongPath(b->lchild,path,pathlen,longpath,longpathlen); //递归扫描左子树

LongPath(b->rchild,path,pathlen,longpath,longpathlen); //递归扫描右子树

pathlen--; //恢复环境

}

}

void DispLeaf(BTNode *b)

{

if (b!=NULL)

{ if (b->lchild==NULL && b->rchild==NULL)

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

else

{

DispLeaf(b->lchild);

DispLeaf(b->rchild);

}

}

}

void main()

{

BTNode *b;

ElemType path[MaxSize],longpath[MaxSize];

int i,longpathlen=0;

CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

printf("二叉树b:");DispBTNode(b);printf("\n");

printf("b的叶子节点:");DispLeaf(b);printf("\n");

printf("AllPath:\n");AllPath(b);

printf("AllPath1:\n");AllPath1(b,path,0);

LongPath(b,path,0,longpath,longpathlen);

printf("第一条最长逆路径长度:%d\n",longpathlen);

printf("第一条最长逆路径:");

for (i=longpathlen-1;i>=0;i--)

printf("%c ",longpath[i]);

printf("\n");

DestroyBTNode(b);

}

更多相关推荐:
实验六 二叉树实验报告(1)

实验四二叉树的操作班级:计算机1002班姓名:**学号:**完成日期:20XX.6.14题目:对于给定的一二叉树,实现各种约定的遍历。一、实验目的:(1)掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法…

二叉树实验报告

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

树和二叉树实验报告

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

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

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

二叉树实验报告

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

二叉树实验报告

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

二叉树的遍历实验报告

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

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

数据结构课程实验报告注空间不够可以增加页码

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

数据结构实验报告课程数据结构实验名称二叉树实验院系电信学院专业班级计科104姓名学号一实验构思首先构造二叉树的存储结构用data存储当前节点的值分别用lchildrchild表示该节点的左右孩子然后应用BiTr...

数据结构实验三——二叉树基本操作及运算实验报告

39985504doc数据结构与数据库实验报告实验题目二叉树的基本操作及运算学院化学与材料科学学院专业班级09级材料科学与工程系PB0920xx3姓学邮名李维谷号PB0920xx85箱liwgmail指导教师贾...

C++二叉树的创建与遍历实验报告

数据结构集中上机试验报告学院计算机科学与技术专业计算机科学与技术学号班级姓名20xx1126题目二叉树的创建与遍历一实验目的1学会实现二叉树结点结构和对二叉树的基本操作2掌握对二叉树每种操作的具体实现学会利用递...

数据结构二叉树的递归算法实验报告

齐鲁工业大学实验报告成绩课程名称数据结构指导教师单健芳实验日期院系信息学院专业班级计科嵌入141实验地点学生姓名高晨悦学号20xx03071007同组人无实验项目名称二叉树的递归算法一实验目的和要求1实现二叉树...

二叉树实验报告(43篇)