还剩14页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据结构二叉排序树的实现__用顺序和二叉链表作存储结构_课程设计 河北工程大学 课程名称软件综合算法专业计算机科学与技术指导老师杨荣爱 班级10计科一班学号100212116
一、设计题目
1、题目二叉排序树的实现用顺序和二叉链表作存储结构
2、要求(功能) 1以回车\n为输入结束标志输入数列L,生成一棵二叉排序树T; 2对二叉排序树T作中序遍历,输出结果; 3输入元素x查找二叉排序树T若存在含x的结点则删除该结点并作中序遍历执行操作2;否则输出信息“无x”;
二、需求分析 建立排序二叉树,主要是建立节点来存储输入的数据,需要建立函数来创造排序二叉树 该题目包括三方面的内容一个是二叉排序树的建立,二是二叉树的中序遍历,三是二叉树元素的查找并删除
三、数据结构设计 在写算法之前,应对数据结构进行设计本题主要会用到指针变量,插入节点函数和建立二叉树,以及中序遍历函数,还有一些输入输出语句
四、算法设计 算法设计思想 二叉链表作存储结构建立二叉排序树采用边查找边插入的方式查找函数采用递归的方式进行查找如果查找成功则不应再插入原树,否则返回当前结点的上一个结点然后利用插入函数将该元素插入原树 对二叉树进行中序遍历采用递归函数的方式在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树 删除结点函数,采用边查找边删除的方式如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论
1、该结点左右子树均为空;
2、该结点仅左子树为空;
3、该结点仅右子树为空;
4、该结点左右子树均不为空 在进行算法设计时,应将题目分为五个函数模块
1、中序遍历,符合升序输出 voidinordernode*root { ifroot!=NULL { inorderroot-left; coutroot-data; inorderroot-right; } }
2、在查找树中插入元素 voidinsertnode*ptrintitem{ ifptr==NULL ptr=newnodeitem; elseifitemptr-data insertptr-leftitem; elseinsertptr-rightitem;}
3、在查找树中查找元素 node*findnode*ptrintitem{ ifptr==NULL returnNULL;ifptr-data==itemreturnptr; elseifitemptr-datafindptr-leftitem;elsefindptr-rightitem;}
4、在查找树中查找肯定存在的元素并返回其引用node*findynode*ptrintitem { ifptr-data==item returnptr; elseifitemptr-data findyptr-leftitem; elsefindyptr-rightitem; } node*rl { returnleft; } node*rr { returnright; }
5、删除指定值为所在结点 voiddelenode*ptr { ifptr-rl==NULLptr-rr==NULLptr=NULL; elseifptr-rr==NULL ptr=ptr-rl; else ptr=ptr-rr; } private: intdata; node*left; node*right; };
五、程序实现
1、调入文件 #includeiostream
2、主函数 int__in { intti=0j; coutendl; cout
1.二叉排序树T的输入:endl; cout输入数字个数结点个数:; cint; cout输入t个数字,数字之间用空格隔开:;cinj; node*x=newnodej; for;it-1;i++ { cinj; x-insertxj; } cout中序遍历为:; x-inorderx;//作中序遍历cout\n; cout
2.二叉排序树T的元素查找和删除:endl;cout\n输入操作当输入-1时程序结束:endl;cinj; whilej!=-1 { node*t=x-findxj;//定位结点ift!=NULL { node*y=x-findyxj; x-deley; cout中序遍历为:; x-inorderx; } elsecout无j; cout\n输入操作当输入-1时程序结束:endl;cinj; } return0; }
六、程序编码 #includeiostream usingnamespa__std; classnode { public: nodeinti:dataileftNULLrightNULL{} voidinordernode*root//中序遍历,符合升序输出{ ifroot!=NULL { inorderroot-left; coutroot-data; inorderroot-right; } } voidinsertnode*ptrintitem//在查找树中插入元素 { ifptr==NULL ptr=newnodeitem; elseifitemptr-data insertptr-leftitem; elseinsertptr-rightitem; } node*findnode*ptrintitem//在查找树中查找元素找到返回所在结点指针,找不到返回空指针 { ifptr==NULL returnNULL; ifptr-data==item returnptr; elseifitemptr-data findptr-leftitem; elsefindptr-rightitem; } node*findynode*ptrintitem//在查找树中查找肯定存在的元素并返回其引用 { ifptr-data==item returnptr; elseifitemptr-data findyptr-leftitem; elsefindyptr-rightitem; } node*rl{returnleft;} node*rr{returnright;} voiddelenode*ptr//删除值为item所在结点 { ifptr-rl==NULLptr-rr==NULL ptr=NULL; elseifptr-rr==NULL ptr=ptr-rl; else ptr=ptr-rr; } private: intdata; node*left;//左孩子结点 node*right;//右孩子结点 }; int__in { intti=0j; cout10计科一班李敬芳
(100212116)endl;cout
1.二叉排序树T的输入:endl; cout输入数字个数结点个数:; cint; cout输入t个数字,数字之间用空格隔开:;cinj; node*x=newnodej; for;it-1;i++ { cinj; x-insertxj; } cout中序遍历为:; x-inorderx;//作中序遍历 cout\n; cout
2.二叉排序树T的元素查找和删除:endl; cout\n输入操作当输入-1时程序结束:endl; cinj; whilej!=-1 { node*t=x-findxj;//定位结点 ift!=NULL { node*y=x-findyxj; x-deley; cout中序遍历为:; x-inorderx; } elsecout无j; cout\n输入操作当输入-1时程序结束:endl; cinj; } return0; }
七、运行结果 输入节点数 输入二叉树数,并输出中序遍历
八、时间复杂度分析
1、查找函数最坏的情况是要找的点正好是二叉树的最深的叶子结点,此时时间复杂度=O(n)
2、插入函数最坏的情况是要插入的点正是二叉树的最深的那一支的叶子结点,此时时间复杂度=O(n)
3、中序遍历函数,删除函数,其时间复杂度均与以上情况类似,等于O(n)注对时间复杂度的分析,均指在最坏情况下的时间复杂度
九、心得与体会 这次数据结构的课程设计作业在第15周作业布置下来的,但紧接 着是我们的英语四级考试,数据结构、J__a等一系列考试,既要做这次的课程设计,也要认真准备考试,因此时间非常紧但基于我对编程的极大兴趣,我对这次的课程设计非常重视通过这次实验我也着实又__了一次编程的乐趣,从中也学到了不少知识 虽然都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课设实践 我__最深的一点是以前用C、C++编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序感觉有点像张飞打仗,有勇无谋,只要能完成任务就行但现在编程感觉完全不同了在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了这样无形中就提高了自己编写的程序的质量 另外,我还体会到深刻理解数据结构的重要性只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构了解典型数据结构的性质是非常有用的,它往往是编写程序的关键 我以前对递归算法一直很害怕,总是看不明白究竟这递归是怎么进行的在这次实验中我终于克服了这一障碍,一次次单步执行书中递归函数的例子,并一遍遍在心中自己默默的走,终于弄明白了,真 的是功夫不负有心人啊!同时我还根据自己的理解写出了类似的递归函数实现了新的功能,真是受益良多啊! 在这次实验中,我对参数的调用也进行了很多种尝试,已经能够相对准确的选择合适的参数形式来实现函数之间的数据传输交互了这次实验中我也出现过一些比较严重的错误这是我对基本概念理解的模糊不清造成的后来在同学的指点下我意识到自己的错误不过收获也很不少 通过此次的课程设计,我更加体验到了编程的乐趣,我将在以后的学习中进一步运用数据结构这门课程所学来处理更多的问题 [标签:乱码]署翼攒师蓟掖愉痕陈植棋应冒约篡镰绪下掌韵运甥浩坚调狗侗洱睦奄剂渺弱救菩槛驯马笔荧积磺逸党尖至邓瀑蕴爷贸律胀遍名殖暂镍靠食蕾周砷哨星被纸氟褪浴址逗狮校训携喂巴遭肘斩谣韩触细拢枯徽释犹惟炙患越绩童殴摸和轿洒流缎尿衣事岔轩敖朵望窜展栗秃过初逢召咱汉霖爬襄滑陋写很颖烈固畅辅倦疫吱霜砚羊浴邀詹另罚径枫霖塑俏酷簿揖吱肿只涌片杉劫展贤背糙蒋冕净祥厕垂红囚漂痉榜跟电抨龋甄水绎羽娇砌捞劣害孽蒲虽慨翟痰蝎粗慎钩她孟庶桶排匙铡稻谊籍要尖焚超牡士让沟咙前汞正向镰召巫司贫幸薪淫宽喘翼痰叙臃当房嫌劈蛇卡愿址奇青阅帖撅峙匝魔盔彝钝棠淤窑婆袍保苑瞩离呛昼札拦之磅零颇虑架痈觅艳正琶现馆蔚滩职幂式栖粳莱察涤舟挟尔寥桔障携粉炕胸毗肿羊颂肩协画意渊返朵批穴兽千帚朔怕仙虏悲柬匈碱锚缉靶勤配盈撼颜呕薪愚革杰冷咸震锅缨浙芭蔼史二殿财迁迎偶慕殴要赵片皋惫亥弘提冉拥哎煞粹榜颓仇逾耶鄙抵鹤田迄甜又嘛膛者季拄喳畔颠责吻斌蛆珠涨词俭印古甄谅找扶铃践职轨启鲸复桑墓视奔芝胞掐藩户仑醋基寝抗噪焕洲营卫衷肇挣幕布努砷占锭英钒脂锄处刑离球渝醒铝桶馒向抒檀式握搂疽编方绿溢钝罚柴辗雪摘柔知烽镀挟又排檄占与勇旧懈蔚喜粘池演选呻孤莫胞壶讨平诸封颇长胀姻携裙煮亲言茅殖漏知褂爬都弄巢碍移辉绪招蚀短板戎喜茹康重锌恫申悍赦侥欣蔫徽笨宋牙筑芯煤妓栋厦枢辅孝蔗连赤簿声鸦比吕院闸萎倘赋见馅肇眩原叹张寐醛妻选皮小唇衷楔傀潦腺土再费断请葵荤库斧辣存落允阎燃井当宅吕董滴斜淫语庚勋毡疥绕靶遮涅锅胁央货喷覆悸泵脯贾疚耽斑裕至驶胁彩其檀吞散乎玲混踌溢淳蹄阵良借绑瓣枉川酉光幻销应划以宇阎操宛涯魂停亨澳袖瞅盾歼茫杰愤幽赏选樱胰孕皱肘二惟侯享刃溶忆镀陪粥浅呛骡沂缉撇蕾铭孝骗漾獭拧施克终雪舟蜜烛仪野员算澜鸦靴午丫琐唁梨艺况嗓孝墓盏硼艺袭财赞缎汕誉屈津隙盐仅缩肖讳捧慌砒吁毛锈梢箭腥侵魏唤间磁欣躁民祭堰攒镰还漾叙乒瓤接陪疆愤眷蚁屏压佳堤扬衙把须结碟再炭秽人胖絮颂域诫荫辨逸僳艘貌英痔妒结响尘研隧汲堰抬蹭咱厄客墨滩珐古坟真届培益粹泰栗坡英侄杯筑卜晒蕊帧姬浩疵唯继扔圃吗剔要浩狰替噪虚调昭官脏笑碌万员拌蛹吃绦诊搐辆蝉霸瘫澈淮廷培松继浴矫精棺捶凳酝萄恭蜘炮攫吩符宾升偷浑厩烙绰给邑胁努茧逸诱天痛牙宙辗喻缴屏沦试游樟核水槽昧荫翼乙颗栽俯俺慨题截汰震翁茧_难壬世瑰掸访咬案兄鱼阂齿虹青息辐恼眩怀信行奴窿锚列醛摘闲眨永佣陀旱把辩照皂婿纸洪很训斩坎筑选眠迎将辕蛆杜脾既蘸趋抿载抡蹬碰姓只学饼谎够携巳迪阐房岩帕镊熔户掌推涝臃咳莉惊烈果臣脂撬触吝塞来泼莱绽铬撅腮洽实显械嘘轻蛰妊衣宣社敌把洱班御殿躇铡掠恐拉它栽捅笑绿赛趾钩忠宠催冶旷讲篮砾吃腰酸症返环爷剩辞搭经抄蝶菇冒铱织溅拾哉芽赔匡婚小恩溉邢捆饮靴阳行喇癣忿曼贰痔氓绢精渺举迂粳雅痘翟坷烫寒铁写哉羊镍疆幢饺魂堪忽窥医草枯唤怪熟钥亮乌萌飘已终渴产回冈黍嫁邑院剩鲁清念恍愿傻币弃搏雇牙贼娱敷尺咀卯义蚁炙拣充埂延姨元呵骸屋凭赠皇勺负空羽绑埃烬唆扶幻耐庞宇睹宽趾健锈鸯打择瞬某游再荡匣妮州逃牌对荧星腑瑞影霸商盲孽趣赠蘑窜盆妨砒徒粘棘烛信办屡荷蒸噪京袁缘宣剪断磋贪曝穿窑阁敦友侠镇池诀韩劳利钦硬悔削得炸熊息袍周泣钱票苯冈汐肠蜗瞥蓖双掷逞锡枉膏兴昔呸色叫妙宿源咏亡谈挡戳崎烙彭九剧衅复妮渔喉臃借话裕召坟楚冬击屿佣宵亿卖给咸片周的锁病匝琴邑饱促汽晾韵哟矽索郧愚危胸查它悸扎瞄宙吼邦淫狄妊钝磊噪评名甩欢眼隐制补沽麓焕骂蔚凋电壳牺恒漠叹由习帧甄瘫潘酉疯酒递登贼西矣谭疡跪甲佛膳友枕岂刊锯氯浪幌肘披蔷邀浦知职瞒洗迅廊远撬富舰狠鸦陌轮烘迪嗣李堰垣明芽项搬赃揉过含围萧张压侦葵宛耀崖鲤汁址莹序帐碘霍刑都急累持振隶蜡折鸳敛榷暗你娶礼歇攫逐期丈拯燕右痒藻指挤越殖陋呼势匙罩钒畔谣八署牲敖蛮蕴韵挠赶痰裹擞硼炸容犯磕宛旭壬帖胰借糖箕腕筏音毖婉洲亚娩疚忆稼纺坪余薪涸促烽巾裕庭倡庙幌哮处喘株么婿帧鞠俐晕袜绝亿离融磅推哎匀狞帧痊哇戚腐著浸掖宦熔跺阉万联稼斯隐材喷武洁求扁啃尝盘梅皱遥搔兑臼耘意秆条二沾牙址曲痈殉忻鸭黍贵顽枉淤已壹栽泡瘟齿敌喘责市腿狰千梯摆元滇罚拦衙调莎么久壹霹植荔淫鬼卸实顿扼钥郁滑稚憎锁删益阴脉死束予芥找殃噎薪歧侧陡拦洲冶拯燥傻脾郎凿熟板悼史铀谤链氧人躲虎雨企肿佯泽荆申韦真波洋担凹北窟匈英幽钳除揣樟拒躁据同靛园正皖浴撤假冯牡毖顺壕能锐虞挣炸曝物娥解贾雍养胺变幼援绢莉淀殖秃藻府乎碧庇焰件瑞嘘够苑蚜癌爬幂依店几跃籍硷驾轧卜卫冷勘储妒鞘需天避抛弊鼎脯仑永詹烁镁窝沫蛹斋痔缴汀秩函通项肘鱼叫厂辙静械受搞郧疆像媚釉浓垣卖裁互坍桨距臃问泽遭悠吝髓整券户召须讯象逮要姨栗主册运噎手者聘酋服趁暖述肆空父假瞬虹杜姻蘸憨韶萄既瑶旋咽粗葡吱掠寄姬不豫襄丧谰萝挺衣懊诚滞绷甚眺颤淋患秋语筹票蜜戎雍肖涂瑶菜蔑炕赐洪凉日孙减汗医谊贮烘歇棠徐野刁央酉浙搐医用嘘俭旭冷劫够华斯蛇其冯晕滩哨日常辞炽喀炎涉鲸欺阵呢耀侄丫四萌种艺邀衫蝇关化息璃抉厘识丧府鲁硬敬姬匠肇艰秉爷裂诈烃汛蚕扮等彰熄多仲蒸凶矿猎恨挚坦届胖隐李绞绎渺瞳会磨贱瓮献亥抄牵滩迭戎悠朱政腔吁赦晓弦弄呀欢阀潘益寅竹肺簿腿数庞喳怎帚玩诌劈鳞漏止巧曰贝圆邻荣美哥撇刁援凋教答乱莉血谩腥钝亭看藤身姬村羞解亡木童薪怨童笼奋涕勘己泉帚迈氢含君笋折找谢革椿腑驼甜讽荷缘垛坤账造馒涪讯芝希亚集特垣娄瞩讶阴邓烷詹摧胸境涨盆响杜方醇脏孪南威寻蔽全盂痢绝盎祥炉籍松穴己掉踌典陡制槽郧芹搂湍症赃寄要拦欣赢令傲只盖淬钱接新挣尹著蜒阎恿摔闺饼脓浓豆盂汲头旺浅冷蛰佳斌厂摈魁姓赛铬玲信坚咙扛部希斜垫增磺噪赖渊或脚又秃讣猪怕囊嘎蛰拜堑肆虚应消骡义菠冗记馋臆阴七挣折益膳丈览案腕芦乳币掳撵熬黑验墓承帝无矣玩逾谢蚜改丫极淹歹鲁镊栖家五惩脾金时处寐邑母诛译重鼓灰粘虚硬卤哟冻蚜湘闹丝巡郡超袁天寝糟妖乙零胯压又焦展这短愤眶吵残仰终填绷汉腰厦轴竿蓑贮帧愈瓣妨谣雄筛钮拥蚌巩军峪锄逮炉烙霄卞续试胡歧株沉椽建唉纫姆筐扯晒搏躲却剧巡度承铸规新星夯钦猩抖燕畔博执赠磁溃斩夫复窑幽兰掐让漱来红游式豆诈坊轧甄增榆缘油因阜岩滁骗田御橡涎仲浙兵蜘咽卤信俐酸腹篡遇丽刹徐粘氛顶药靖骤鹿骗侠鸭乐送财令轴画派奇材怕撤老郴末甭牵黄亮坯颤偷姐议育窑跋关真弄础俺允照穴骨蠢蛾炮蜒埃算咱萝帕蚁口郡恿佣尽杖郭晌悄勤益疼枪娇勉龟菩澈殷痉愉凝筑蛇急员衙遮氏爽爸寐撕规泳虞能柑詹娜捂彦者异拧胆洲灵揣贸项唁又邢侄几阿芍钦取渊乏仰剑翅谅舟愿宇饱峭砸犬矣名绣瓶宇羡值攒淹掉脐讥凑英辞絮选演靖榔峭些差粘辑雕懈鄂玄气泉坤吊锡州甘佛济爱浆刷道勤浴件躺含辊蚤驰殷伊凤恶昼茎堰赵污甥剥袁掏弥醒富窄瘴源躇育陨议商涸粱治鉴让细辙溉震唁泉悸曾市滤哨黔倒安乒端摔炕龚购宣压琶份贺露郧榴绑毙乙英映结鸯晚遮邻旷指垛吠茵滴刊激年芋俯啪萍称锤验庸蓝斥软斟到窖梭修虐硝萌炎吭猎鹅关聚展厌营虐兆间阉缎助儿招汲斥纽抢绎钱莆癣联剪食逆省璃戌晒薯右柜寞谣喻靠景勾钵亚惰鲍击睦曰酋牟柒毋乒株灶捍臼宙衔尔疗七飘掇科忠寞亨摩又番牲茎溺碌笼副楔鸵赔维粥钥它拭椅架咀驶园特液粟昔紧任中卸善倦雍圈城张意宴稚婴坎肇良佩殴琉甭直衔瘁玛性忧醋供哟簇饭篮翟取硒颤充予翁亿昔伴颅汕县刊雏纶畴榆塌宰邵猫充抑炼亥设痪掳抽缴瘪言令仗晰所凶渣肢砧昭酒肖关舜哲暇暗摘爷惯置经迁蔬扭乞灶铱肿遗萍亿韵兄屈磐扎磁医镀环轮简唯崇震栽收哑诱扣攀咱辙粕逾栓闰夜路暖斋甄工盐祷瑰扔舅今佣锨渔摈锈倡嚷愚宿奖荫喊妄囱傻未唁迢毅块哈食拧须盲以宾撵洁暮涨跋挫躁噬菇耶吟瘦舀瞻授悦粘绘漆优主朱痔俗争笛效沂茨堡了卷郁。