二叉树排序设计说明书Word文件下载.docx
- 文档编号:20215749
- 上传时间:2023-01-20
- 格式:DOCX
- 页数:32
- 大小:131.30KB
二叉树排序设计说明书Word文件下载.docx
《二叉树排序设计说明书Word文件下载.docx》由会员分享,可在线阅读,更多相关《二叉树排序设计说明书Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
2.已知二叉树的前序、中序序列,恢复此二叉树。
3.求二叉树的高度。
4.求二叉树的分支节点数。
5.求二叉树的叶子节点数。
6.插入节点到指定位置,删除指定节点。
7.将二叉树中所有结点的左右字数交换。
8.对二叉树进行层序遍历。
在以上的具体模块中采用C语言来实现其功能,通过具体的代码来实现。
相关框图如下:
正正文文1.采用类采用类c语言定义相关的数据类型语言定义相关的数据类型#include#include#include#includetypedefstructnodeintdata;
/节点信息intno;
structnode*lchild;
/左孩子structnode*rchild;
/右孩子BTnode;
voidInit(BTnode*&
b)/初始化intInsert(BTnode*&
b,intm)/插入操作intoutput(BTnode*&
b,inti)/层次输出voidxianxu(BTnode*&
b)/先序voidzhongxu(BTnode*&
b)/中序voidhouxu(BTnode*&
b)/后序voidmenu()/菜单BTnode*b;
Init(b);
inti,j,k,y,m;
intmain()/主函数menu();
system(pause)2.各模块的伪码算法各模块的伪码算法一用二叉链表存储二叉树的算法:
typedefhufnode*linkhuf;
linkhufCreat_Node(intn)/创建二叉链表linkhufhead,pre,p;
intx;
head=NULL;
while(n-)scanf(%d,&
x);
p=(linkhuf)malloc(sizeof(hufnode);
p-data=x;
p-lchild=NULL;
p-rchild=NULL;
if(NULL=head)head=p;
pre=head;
elsep-next=pre-next;
pre-next=p;
pre=pre-next;
returnhead;
linkhufinsert(linkhufroot,linkhufs)/将结点S插入到有序Huffmanroot中。
linkhufp1,p2;
if(NULL=root)root=s;
elsep1=NULL;
p2=root;
while(p2&
p2-datadata)p1=p2;
p2=p2-next;
s-next=p2;
if(NULL=p1)root=s;
elsep1-next=s;
returnroot;
voidPreorder1(linkhuft)if(t!
=NULL)printf(%-6d,t-data);
Preorder1(t-lchild);
Preorder1(t-rchild);
二已知二叉树的前序、中序序列,恢复此二叉树:
/定义二叉树节点templatestructBinTreeNodeTinfo;
/数据域BinTreeNode*llink;
/左孩子BinTreeNode*rlink;
/右孩子;
templateinTreeNode*Restore(constTpre,constTin,int&
count,intlow,inthigh,constintn)/*pre,in分别存储所需恢复二叉树的前序1:
n,中序1:
n,首元素不用的。
count-前序数组的下标low,high确定二叉树的中序边界思路:
将前序的每一个元素当做根节点,然后到中序中找到这个元素,然后再按:
左,中,右,的顺序确定之*/BinTreeNode*p;
if(countn)p=NULL;
returnp;
p=newBinTreeNode;
if(low=high&
precount=inlow)/扫描到叶子节点p-info=precount;
p-llink=NULL;
p-rlink=NULL;
/扫描到非叶子节点for(inti=low;
iinfo=precount;
p-llink=Restore(pre,in,+count,1,i-1,n);
p-rlink=Restore(pre,in,+count,i+1,n,n);
三求二叉树的高度:
statusHighBitree(BiTreet)if(t=NULL)return0;
elsereturn1+Max(HighBitree(t-lchild),HighBitree(t-rchild);
四求二叉树的分支节点数:
/计算单分支结点intcount_n2(BiTreeT)if(T=NULL)returnERROR;
elseif(T-lchild=NULL&
T-rchild=NULL)returnERROR;
elseif(!
T-lchild&
T-rchild)returncount_n2(T-rchild);
if(T-lchild&
!
T-rchild)returncount_n2(T-lchild);
T-rchild)returncount_n2(T-lchild)+count_n2(T-rchild)+1;
/计算双分支结点intcount(BiTreeT)if(T=NULL)returnERROR;
T-rchild=NULL)returnOK;
T-rchild)returncount(T-rchild);
T-rchild)returncount(T-lchild);
T-rchild)returncount(T-lchild)+count(T-rchild);
if(!
T-rchild)returncount(T-lchild)+count(T-rchild)+1;
五求二叉树的叶子节点数:
statusNumberLeaves(BiTreeT)/先序遍历得到叶结点的数目/m=0;
if(T)if(T-lchild=NULL&
T-rchild=NULL)m+;
NumberLeaves(T-lchild);
NumberLeaves(T-rchild);
returnOK;
intbtnodeheight(BiTreeb)intlchildh,rchildh;
if(b=NULL)return(0);
elselchildh=btnodeheight(b-lchild);
rchildh=btnodeheight(b-rchild);
return(lchildhrchildh)?
(lchildh+1):
(rchildh+1);
六插入节点到指定位置,删除指定节点:
intInsert(BTnode*&
b,intm)/插入操作BTnode*q;
if(count=1)b=(BTnode*)malloc(sizeof(BTnode);
b-data=m;
b-no=count;
b-lchild=b-rchild=NULL;
count+;
elseif(b!
=NULL)if(b-no!
=count/2)if(Insert(b-lchild,m)=0)return0;
if(Insert(b-rchild,m)=0)return0;
elseq=(BTnode*)malloc(sizeof(BTnode);
q-data=m;
q-no=count;
q-lchild=q-rchild=NULL;
if(count%2=0)b-lchild=q;
elseb-rchild=q;
return0;
/*插入左子树*/bitnode*insertl(bitnode*b,charx,chare)bitnode*stackMAXNODE,*p,*s,*t;
s=(bitnode*)malloc(sizeof(bitnode);
s-data=e;
s-lchild=NULL;
s-rchild=NULL;
inttop;
if(b!
=NULL)top=1;
stacktop=b;
while(top0)p=stacktop;
top-;
printf(%c,p-data);
if(p-data=x)t=p;
if(p-rchild!
=NULL)top+;
stacktop=p-rchild;
if(p-lchild!
stacktop=p-lchild;
s-lchild=t-lchild;
s-rchild=t-rchild;
t-lchild=s;
printf(n);
return(b);
voidprint(bitnode*b)if(b!
=NULL)printf(%c,b-data);
if(b-lchild!
=NULL|b-rchild!
=NULL)printf();
print(b-lchild);
if(b-rchild!
=NULL)printf(,);
print(b-rchild);
printf();
/*插入右子树*/bitnode*insertr(bitnode*b,charx,chare)bitnode*stackMAXNODE,*p,*s,*t;
t-rchild=s;
/*删除左子树*/bitnode*deletl(bitnode*b,charx)bitnode*stackMAXNODE,*p,*t;
t-lchild=NULL;
/*删除右子树*/bitnode*deletr(bitnode*b,charx)bitnode*stackMAXNODE,*p,*t;
t-rchild=NULL;
if(a=4)printf(请输入要插入结点的双亲及要插入的元素(如bc)-);
charx,e;
cinxe;
print(insertl(bt,x,e);
coutendlendlendlxe;
print(insertr(bt,x,e);
coutendlendlendly;
print(deletl(bt,y);
print(deletr(bt,y);
coutendlendlendllchild);
depthRight=Depth(T-rchild);
depthval=1+(depthLeftdepthRight?
depthLeft:
depthRight);
returndepthval;
八对二叉树进行层序遍历:
intcount_n1(BiTreeT)if(T=NULL)returnERROR;
T-rchild)returncount_n1(T-rchild)+1;
T-rchild)returncount_n1(T-lchild)+1;
T-rchild)returncount_n1(T-lchild)+count_n1(T-rchild)+1;
3.函数的调用关系图函数的调用关系图4.调试分析调试分析a、调试中遇到的问题及对问题的解决方法调试中遇到的问题及对问题的解决方法调试中许多错误都是语法错误,还有有些错误属于参数没有合理的定义,通过细心的修改和老师同学的帮助,算法得以完善。
算法能够编译通过,运行结果正确,能够实现设计所要求的功能,算法相对比较完善。
b、算法的时间复杂度和空间复杂5.测试结果测试结果当输入12345时即建立一个二叉树三种遍历。
输出为:
前序遍历为:
12345中序遍历为:
32415后序遍历为:
34251若选择3,即输出叶子。
345若选择4,即输出树形。
15423若选择5,即销毁树,屏幕会提示树已销毁。
若选择6,则退出程序。
截屏如下:
6.源程序(带注释)源程序(带注释)#include#includeusingnamespacestd;
typedefcharTElemType;
typedefstructBiTNode/定义节点TElemTypedata;
structBiTNode*lchild,*rchild;
BiTNode,*BiTree;
intDLRcreat(BiTree&
T)/先序建立二叉树chard;
cind;
if(d=#)T=NULL;
elseT=newBiTNode;
T)exit
(1);
T-data=d;
DLRcreat(T-lchild);
DLRcreat(T-rchild);
intflorder(BiTreeT)/层序遍历指针数组BiTNode*Q100;
/树节点指针数组,用于存放遍历到的元素地址if(T=NULL)cout空的二叉树endl;
Q0=T;
/存入树根inti;
intj=1;
for(i=0;
ilchild!
=NULL)/如果有左孩子,存入地址,j加一,否则没操作Qj=Qi-lchild;
j+;
if(Qi-rchild!
=NULL)/如果有右孩子,存入地址,j加一,否则没操作Qj=Qi-rchild;
ij;
i+)coutdata;
inthowmuch(BiTreeT,inth)BiTNode*Q100;
/存入树根inti,k=0;
/j-1为总节点for(i=0;
if(Qi-lchild=NULL&
Qi-rchild=NULL)k+;
/计算叶子数i=ceil(log(j-1)+1;
/计算深度if(h=0)returnj;
elseif(h=1)returnk;
elseif(h=2)returni;
elsecout参数错误;
intDLRorder(BiTreeT)/先序遍历if(T!
=NULL)coutdata;
/访问根结点DLRorder(T-lchild);
/前序遍历左子树DLRorder(T-rchild);
/前序遍历右子树return0;
intLDRorder(BiTreeT)/中序遍历递归if(T!
=NULL)LDRorder(T-lchild);
coutdata;
LDRorder(T-rchild);
intLRDorder(BiTreeT)/后序遍历递归if(T!
intexchang(BiTree&
T)/交换左右子树if(T!
=NULL)if(T-lchild!
=NULL&
T-rchild!
=NULL)/当有左右孩子时才交换chart;
t=T-lchild-data;
T-lchild-data=T-rchild-data;
T-rchild-data=t;
/交换数据exchang(T-lchild);
/递归调用exchang(T-rchild);
intchoose(BiTreeT)/功能选择inta;
cina;
if(a=1)cout先序遍历;
DLRorder(T);
elseif(a=2)cout中序遍历;
LDRorder(T);
elseif(a=3)cout后序遍历;
LRDorder(T);
elseif(a=4)cout层序遍历;
florder(T);
elseif(a=5)cout总节点数:
howmuch(T,0);
elseif(a=6)cout总叶子数:
howmuch(T,1);
elseif(a=7)cout树的深度:
howmuch(T,2);
elseif(a=8)cout交换前endl;
exchang(T);
cout交换后;
elseif(a=9)exit
(1);
elsecout没有这个操作endl;
coutendl操作完成,请输入下一个操作endl;
choose(T);
intmain()/主函数cout-二叉树的基本操作-endl;
cout请先建立二叉树,按先序的方式输入如果数据为空输入#endl;
BiTreeT;
/定义二叉树,初始化DLRcreat(T);
cout1.先序遍历二叉树2.中序遍历二叉树endl;
cout3.后序遍历二叉树4.层序遍历二叉树endl;
cout5.求总节点数6.求叶子总数endl;
cout7.深度-完全二叉树有效8.左右子树交换endl;
cout9.退出endl;
总总结结这次编程序感觉有点难,因为二叉树的功能太强大,实现起来有点你困难,所以做之前还要把书好好看看,基本步骤书上还是有的,如基本操作遍历,建立,删除等等。
通过这次编程确实使自己对书本上的知识有了进一步的了解,特别是二叉树的相关知识。
但由于自己平时学的不是太全面,所以这次编程感觉有点困难。
看来基本知识还有待加强。
通过对一个抽象数据类型的分析、设计、上机编程实现,巩固深化对二叉树的基本概念、理论和方法的理解,逐步掌握针对应用问题特点选用适当结构和算法的技巧,提高灵活运用知识的能力和专业化程序设计能力。
通过实现二叉树的一些基本操作,主要有使用二叉链表和三叉链表存储二叉树,主要功能有:
对二叉树进行层序、非递归中序遍历等操作,我对二叉树有了很好的掌握和理解。
在完成编码以后,对于测试至少含有10个测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果。
这次课程设计结束后,我收获很大,懂得了怎样设计一个数据结构和算法来实现一个特定的函数和功能,对我今后的编程帮助很大。
参考文献参考文献1严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社。
2严蔚敏,吴伟民.数据结构题集(C语言版).清华大学出版社。
3DATASTRUCTUREWITHC+.WilliamFord,WilliamTopp.清华大学出版社(影印版)。
4谭浩强.c语言程序设计.清华大学出版社。
5数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译电子工业出版社2001年1月。
致致谢谢在编写本文档的过程中我遇到了好多问题,首先感谢老师的指点和帮助。
本次课程设计对我来说有点难度,在课程设计的过程中参考了大量的书籍和文献,尤其是数据结构和算法。
其次,在编译过程中遇到了很多语法错误,还有非法的参数问题等,周围的同学对我的热心帮助对我这次课程设计帮助很大。
附件附件部分源程序代码部分源程序代码#include#includeusingnamespacestd;
int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 排序 设计 说明书