综合性实验报告和完整代码.docx

上传人:b****5 文档编号:3047669 上传时间:2022-11-17 格式:DOCX 页数:46 大小:364.52KB
下载 相关 举报
综合性实验报告和完整代码.docx_第1页
第1页 / 共46页
综合性实验报告和完整代码.docx_第2页
第2页 / 共46页
综合性实验报告和完整代码.docx_第3页
第3页 / 共46页
综合性实验报告和完整代码.docx_第4页
第4页 / 共46页
综合性实验报告和完整代码.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

综合性实验报告和完整代码.docx

《综合性实验报告和完整代码.docx》由会员分享,可在线阅读,更多相关《综合性实验报告和完整代码.docx(46页珍藏版)》请在冰豆网上搜索。

综合性实验报告和完整代码.docx

综合性实验报告和完整代码

华南农业大学信息学院

综合性、设计性实验

起止日期:

2011秋

学院

专业班级

学号

姓名

实现平衡二叉排序树的各种算法

项目

算法设计

独立完成情况

算法熟练程度

测试通过

成功

失败

独立

帮助

掌握

了解

不懂

插入新结点

A

A

A

A

前序、中序、后序遍历二叉树(递归)

A

A

A

A

前序、中序、后序遍历的非递归算法

A

A

A

A

层次遍历二叉树

A

A

A

A

在二叉树中查找给定关键字

A

A

A

A

交换各结点的左右子树

A

A

A

A

求二叉树的深度

A

A

A

A

叶子结点数

A

A

A

A

删除某结点

A

A

A

A

 

●A---------完成实验要求的全部功能并运行通过,算法有一定的新意,程序代码符合书写规范,实验报告叙述清晰完整,有详尽的分析和总结。

●B---------完成实验要求的全部功能,程序代码符合书写规范,实验报告叙述清晰完整。

●C---------完成实验要求的大部分功能,实验报告良好。

●D---------未按时完成实验,或者抄袭。

成绩

教师签名:

 

《实现平衡二叉排序树的各种算法》实验报告

班级:

姓名:

学号:

完成日期:

 

一、分析题目要求

用函数实现如下平衡二叉排序树算法,:

(1)插入新结点

(2)前序、中序、后序遍历二叉树(递归)

(3)前序、中序、后序遍历的非递归算法

(4)层次遍历二叉树

(5)在二叉树中查找给定关键字(函数返回值为成功1,失败0)

(6)交换各结点的左右子树

(7)求二叉树的深度

(8)叶子结点数

(9)删除某结点

为了完成以上的各项操作,首先应该用函数建一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。

在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。

可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。

在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。

在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。

在遍历二叉树的结点时需要一个访问结点数据的函数。

二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。

交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。

示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。

可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。

删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还是左右子树都有的情况:

若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。

下面是需要用到的函数列表:

//队列结构

StatusInitQueue(SqQueue&Q);//初始化队列

StatusEnQueue(SqQueue&Q,QElemTypee);//进队列

StatusDeQueue(SqQueue&Q,QElemType&e);//出队列

StatusGetHead(SqQueueQ,QElemType&e);//获队列首

intQueueLength(SqQueueQ);//队列长度

StatusQueueTraverse(SqQueueQ);//遍历队列

//栈结构

StatusInitStack(SqStack&S);//初始化栈

StatusPush(SqStack&S,SElemTypee);//进栈

StatusPop(SqStack&S,SElemType&e);//出栈

StatusGetTop(SqStackS,SElemType&e);//获栈顶

intStackLength(SqStackS);//栈的长度

StatusStackEmpty(SqStackS);//判栈空

StatusStackTraverse(SqStackS);//栈的遍历

//平衡二叉树

voidR_Rotate(BSTree&p);//右旇

voidL_Rotate(BSTree&p);//左旇

StatusInsertAVL(BSTree&T,ElemTypee,Boolean&taller);//平衡二叉树结点插入

voidLeftBalance(BSTree&T);//左平衡

voidRigthBalance(BSTree&T);//右平衡

StatusCreateBST(BSTree&T,intn);//建树

StatusVisit(ElemTypee);//访问

StatusPreOrderTraverse(BSTreeT);//前序遍历

StatusInOrderTraverse(BSTreeT);//中序遍历

StatusPostOrderTraverse(BSTreeT);//后序遍历

StatuspreOrderIter(BSTreeT);//前序非递归遍历

StatusinOrderIter(BSTreeT);//中序非递归遍历

StatuspostOrderIter(BSTreeT);//后序非递归遍历

StatusFindBST(BSTreeT,ElemTypekey,int&n);//在二叉树中查找关键词

StatusOverTraverse(BSTree&T);//层次遍历

StatusOverChang(BSTree&T);//交换左右子树

intBSTDeep(BSTreeT);//求树的深度

StatusSum(BSTreeT,int&n);//求结点数

StatusDeleteBST(BSTree&T,intkey,bool&taller);//删除结点

StatusDelete(BSTree&p,bool&taller);

StatusDelete2(BSTree&p,booltaller,ElemType&f);

voidMU();//选择菜单

 

二、解题思路

对于要实现的各个操作求解过程:

(1)插入新结点

用递归查找二叉树的方式找到新结点插入的位置,若已经存在该结点则返回ERROR,若不存在,则插入新结点,并回溯调整二叉树的平衡。

伪代码如下:

StatusInsertAVL(BSTree&T,ElemTypee,Boolean&taller)

{

If(!

T){插入新结点,树深度增加}

Elseif(edata){查找左子树,如果子树增高,调整树平衡}

Elseif(e>T->data){查找右子树,如果子树增高,调整树平衡}

ReturnOK;

}

(2)前序、中序、后序遍历二叉树(递归)

用递归的方式遍历每一个结点,如果左子树不为NULL,则遍历左子树,否则返回;如果右子树不为NULL,则遍历右子树,否则返回。

伪代码如下:

StatusPreOrderTraverse(BSTreeT)//前序遍历

{if(T)//若结点不为空

{if(Visit(T->data))//访问结点

if(PreOrderTraverse(T->lchild))//查找左子树

if(PreOrderTraverse(T->rchild))//查找右子树

returnOK;

returnERROR;}

elsereturnOK;

}

StatusInOrderTraverse(BSTreeT)//中序遍历

{if(T)//若结点不为空

{if(InOrderTraverse(T->lchild))//查找左子树

if(Visit(T->data))//访问结点

if(InOrderTraverse(T->rchild))//查找右子树

returnOK;

returnERROR;

}

ElsereturnOK;

}

StatusPostOrderTraverse(BSTreeT)//后序遍历

{if(T){//若结点不为空

if(PostOrderTraverse(T->lchild))//查找左子树

if(PostOrderTraverse(T->rchild))//查找右子树

if(Visit(T->data))//访问结点

returnOK;

returnERROR;

}elsereturnOK;

}

(3)前序、中序、后序遍历的非递归算法

应该用栈先进后出的性质来保存结点的指针,出栈的过程就是回溯的过程。

伪代码如下:

StatuspreOrderIter(BSTreeT)//前序非递归遍历

{if(T==NULL)returnERROR;//若结点不为空

Push(S,p);//根结点进栈;

while(!

StackEmpty(S))//栈不空

{GetTop(S,p);//获栈顶

Visit(p->data);//先序访问结点

Pop(S,p);//出栈

if(p->rchild!

=NULL)

Push(S,p->rchild);//右子树进栈

if(p->lchild!

=NULL)

Push(S,p->lchild);//左子树进栈

}returnOK;

}

StatusinOrderIter(BSTreeT)//中序非递归遍历

{if(T==NULL)returnERROR;//若结点不为空

while(p!

=NULL||!

StackEmpty(S))

{if(p!

=NULL)

{Push(S,p);//所有左孩子进栈,

p=p->lchild;}

else{

GetTop(S,p);//获最后一个左子树的结点

Visit(p->data);//访问结点

Pop(S,p);//最

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1