维普资讯 http://www.cqvip.com 2008年第6期 福建电脑 103 线性时间复杂度的二叉树绘制算法 李新燕 (广州航海高等专科学校计算机与信息工程系广东广州510725) 【摘要】:二又树一种非常重要的数据结构,本文论述了绘制二又树算法的基本思想,建立二又树与满二又树结点间 的映射关系,并给出可行的对应算法,且其时间复杂度是线性的。 【关键字】:二叉树;满二又树;结点 1.概述 在计算机科学领域中.树形结构是一种非常重要的非线性 结构。在解决各种问题,如文件管理、数据库、编译系统等的算 法.树形结构有广泛的应用。而二叉树是树形结构的另一种重要 类型.许多算法问题用二叉树形式来解决非常简单方便,并且任 何树形结构都可以通过一个简单的转换得到与之对应的二叉 树 因此.研究有关二叉树的算法显得十分必要。同时有关二叉 树的各种算法也是数据结构这门课程的重要内容和学习的难 点。 通常,在机上验证算法或自己编写有关算法时,想了解最终 的二叉树的结构一般是通过对二叉树进行前序或中序、后序遍 历的序列来分析.从而确定结果是否正确。但由于输出的结果是 一组序列,这给分析结果带来难度。因此,绘制一棵二叉树,使结 果能以一目了然的树状输出.就显得很有现实意义。本文主要讨 论如何借用满二叉树来绘制一般二叉树.所论述的方法可用 Turbo C。Visual C++等系统来实现。 2.基本思想 绘制二叉树时应考虑的问题是如何使绘制出来的结点不产 生交叉。且每一层的结点均匀分布。同时能反映出是其双亲结点 的左孩子或右孩子。为了实现以上思想,可借助满二叉树,它的 特点是每一层的结点数都是最大结点数.即一棵深度为k的满 二叉树有2 —1个结点。如图1所示是一棵深度为4的满二叉 树。 满二叉树有以下性质:如果对一棵有n个结点的满二叉树 (其深度为loga(n+1))的结点按层次依次编号(从第一层到第lo (n+1)层,每层从左到右编号),则对任一结点i(1≤i≤n),有:(1) 如果i_1,则结点i是二叉树的根,无双亲;如果i>l。则其双亲是 结点 2J。(2)如果2i>n,则结点i无左孩子。且结点i为叶子 结点;否则其左孩子是结点2i。 (3)如果2i+1>n,则结点i无右孩 子:否则其右孩子是结点2i+1 (其中”L J”表示取向下整运 算)。 由图1可见.按照满二叉树 确定其在绘图区中的坐标位置.中各个结点所处的相对位置来 图l满二叉树 那么最终树中的各个结点必定不会交叉且均匀分布.同时各个 非根结点的左右关系十分明确。 然而通常所要画的二叉树并非像满 二叉树那样,各个结点呈现均匀分布.遍 布各层.但可以把一般二叉树的各个结 点给出的位置看成与满二叉树中的结点 位置相对应,如图2所示 因此.可以先 确定满二叉树各个结点的位置.然后画 出与一般二叉树对应的结点.其他不存 在的结点不画。从而达到目的。 图2二叉树 3.具体处理 为了自动显示一棵如图1所示的满二叉树.在实现时应避 免两个同层相邻不同双亲的结点问的叠 加问题。为有效解决该问题,这里假定:二 叉树是对称显示的:层与层之间的间距都 相等:同层同双亲的两结点的问距都相 等:同层相邻不同双亲的两结点的问距分 别都相等 根据上述规定.可以这样来处 理:先确定下层结点的位置,再确定上层 图3相关参数 结点的位置。如果给定了最底层结点的位置,就可确定整个满二 叉树中所有结点的位置,并且只要最底层结点不叠加,上层结点 也绝不会叠加 因此,可以根据最底层定义以下参数(见图3): (1)同层同双亲兄弟结点间的中心距离为d: (2)同层相邻不同双亲结点问的中心距离为a; (3)结点的半径为r: (4)每层间距为h。 其中d,a,r,h满足如下:h>>2r,d>>2r,a>>2r。h、d、a的 值可根据二叉树的层数适当 调整 然后以最底层的最左结 点的中心为原点.建立如图 4所示的坐标系 由此可以 确定满二叉树中任一结点的 圆心坐标数为k,结点的序号为i):(假定满二叉树层 图4满二叉树的坐标系 先求出结点i所在的层数C=log ̄i+1.i的左子树的最左子女序号 为N=ix2 ̄-c,坐标原点序号为0=2k一1。i结点的x坐标为x(i)=d× L 一0+1)/2J+aX L-(N一0)/2J+2k—c一2xfd+a)一a/2( 中 L J 表示取向下整运算)。该x坐标值看起来很复杂.但含义却很简 单.那就是该值为i结点的最左子女的x坐标与i结点的最右子 女的x坐标和的一半。Y坐标值为y(i)=(k—C)xh。根据坐标可以发 现任何两个同层结点都不会相交。 4.主要算法 typedef st ̄ct node (int data; st ̄ct node*lehild,*rehild; lBTCHINALR; 建立一般--X树与满二叉树结点的映射,即初始指针数组+s[30]+, st ̄ct node・s[30]; BTCHINALR*createbtfB1、cmNALR*bt1 IBTCHINALR q; intj,i: char x: prinff('i,x=’:seanf('%d.% &i,&]‘); while(i!=0&&x!= ¥ ) Iq=(BTCHINALR )malloe(sizeof(BTCHINALR)); 生成一个结点 , q->data=x: q-Mehild=NULL:q->rchild=NULL; s[i]=q: !=1) U=i,2; j为i的双亲结点 , i %2—0) s[j]->lehild=q; i为j的左孩子 , (下转第108页) 维普资讯 http://www.cqvip.com 108 福 建 电脑 2008年第6期 3.实验结果分析 ・实验数据 65.O ̄i我们选取了泉州万维网新闻信息库共24oo篇的文档作为 训练库,该文档集共包含娱乐、体育、商业经济等共12类。实验 所选取的测试集则是我们从网上搜集的中文新闻网页共6O0 I 豳 ;k=12 l4 16 1B } 篇,人工归人该12个类别。 L———————.一————————.._l_ ・实验1:基于ontology的文本聚类分析和基于词集的文本 图2二次聚类学习的精确度比较 聚类分析准确度的比较 只是当k=12时.文本重心尚未调整到最佳的时候.两种算 我们通过建立VSM向量空间模型.形成基于词集的特征集 法聚类效果近似一致。而从整体的聚类质量来看。粗糙集学习后 共7327维,这样初始学习的2400x7327的数据空间。通过概念 的向量空间的聚类质量更优.较之概念集未进行调整的聚类.其 映射。概念消歧等一系列策略处理后。形成的初步概念集为 聚类的准确度高了2~3% 2400x1469。 辫 本文研究说明基于Ontology的中文文本聚类对于提高文本 分别选取聚类数目k=12.16,20.而衡量聚类质量的标准是 聚类性能上有很大帮助。是一次有意义的尝试。并通过引入粗糙 采用Precision准则。 集属性选取可以部分弥补概念聚类对Hownet不完备性有一定 帮助。但这种二次反馈机制肯定不是最好的.因为这种特征之间 的关系在语义上还不够深入准确 怎样进一步强化ontology在 中文文本聚类中的应用。还需要我们深入探索。 参考文献 1.Choon Yang Quek.Classiifcation of world wide web document ISenior 图1基于词集和基于概念集的中文文本聚类算法精确度比较 Honors dissertation】School of Computer Science,Camegie Mellon Umvem- 从图1。我们可以看到.基于ontology的概念空间整体聚类 ty.1997. 质量更好。概念文本聚类得到结果。类簇之间距离较大。类簇内 2.鲁明羽 李凡,庞淑英.陆玉昌。周立桂.基于权值调整的文本分类方法 文档相似度较接近,因此.受聚类总数影响较大一些。类簇中心 改进.清华大学学报(自然科学版)2oo5.43(4).513—515. 之间距离较大.同时表明了该算法得到的文本重心更适于文本 3Jing L.Zhou L,Ng M K.Ontology—bmed distance mcasurc for text clus- 分类器的构造 tering.In:Proc of the 4th Workshop on Text Mining。6th SIAM Interna— iton ̄Conference on Data Mining。2006 ・实验2:引入粗糙集进行概念集的二次学习的效果。 4.董振东.知网.http://www.keenage.corn. 本实验设定域值悉数K--0.6.经过过滤得到概念集中的635 5.史忠植.知识发现.清华大学出版杜.2oo2年. 个义原作为粗糙集二次学习的核。引入依赖度进行决策表约简 6.A.Hotho,S.Staab,A.Maedche.Ontology—based Text Clustering.KI 16, 后.算法在未登陆词集中选取了312个词集作为特征属性。最 2oo2. 终。二次学习后形成的决策表规模为2400x(635+312)。 -—+一-+--4-—+ (上接第103页) sCj]一>rehild=q: /.i为j的右孩子’, l ̄teolor(15); l cirele(x(2*i).y(2’i),radiu); prin i,x= sc】lrl %d.% &i.&x】; line(x(i),y ),x(2’i)'y(2’i)); l setcohr(4); relum 41】 itoa 2’i]->data,str,1 l outtextxy(x(2’i)'y(2’i), ; ,.求二叉树的深度’, diI2’i]-l; int utehighfBTCmNat ̄’bt) l lintllI,rh.h; if(s[il->rchild!=NULL) ifrbt_--m_NUEL) lsetcolor(15); h=m cirele(x(2*i+1).y(2’ 1),ndiu); else hne(x(i).yG),x(2’-+1),y(2’i+1)); llh=tmehigh(bt->lchild); setcolor(4); rh=tr ̄high(bt->rehild); itoa(s[2*i+I]-:Mata,str,1 o): h=oIl>rh?lh:rh)+l;l outtextxy(x(2’I+1),r(2’|+1),s哪; return h: diI2’i+l】=l; J ,.绘制二叉树., } void drawtree(BTCHINALR*bt,lnt k1 /.k二叉树的深度’, l lchat s‘啦】; 以上的相关分析和算法的描述,给出了画二叉树一般方法。 int d 01; int radiu: /.所画的每个结点的半径.按图3要求输人恰当的值’, 该算法的时间复杂度是0(rI/2),n为深度为中k的满二叉树的结 gca %d ,&r丑diu); 点数。该程序是用Turboc 2.0编写,在机上调试通过。但画树时, seteolor(15); 树韵大小受到屏幕大小的影响.然而这不是问题之所在,若把它 for(i=1;i<=O)ow(2.k卜1)/2;i++) 搬入到windows下的编程环境.再适当地加上滚动条,那么画树 iq4i]!=NUⅢ l !d D /.d i】==o,表示第i号结点没画过’, 时就不再会有影响 {seteol ̄l5); cirele(x(i),y(i),radiu); 参考文献: seteolor(4); itoa(s[il->data,str,10】; 1.严蔚敏、昊伟民,数据结构.北京:清华大学出版社.1998 outtextxy(x∞.y( ,s哪; 2、周志华.二叉树的绘制算法.计算机应用研究.1997,第4期:B7 88 dt[il=l; 3、苏光大.吕映芝.用可视化法建立二叉树实例吕振洪、计算机应用研究 l 2001.第9期:56-58 if(s[il->lchild!=NUI t)