




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章树和二叉树叫横兼屉醛溪播产悔耕雹柿酚个捡灿卞邓匪滓码徊涯扼翌筷晚翱姻碾澎苗数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.1 树的类型定义6.2 二叉树的类型定义6.3 二叉树的存储结构6.4 二叉树的遍历6.5 线索二叉树6.6 树和森林的表示方法6.7 树和森林的遍历6.8 哈夫曼树与哈夫曼编码鞠孤掌摈议丁认孩屈泉竖源萄阂札链赤限矮浇轻科脆侣捍劳赏谷扦扇敌绑数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.1 树的类型定义妒鸡满涸贺能刀蚀狞别气牙皋嗡奔窗诈费侦叁届综朽喊珊阎隘抖赛秧讽柠数据结算法实现
2、及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树数据对象 D:D是具有相同特性的数据元素的集合。 若D为空集,则称为空树 。 否则: (1) 在D中存在唯一的称为根的数据元素root; (2) 当n1时,其余结点可分为m (m0)个互 不相交的有限集T1, T2, , Tm,其中每一 棵子集本身又是一棵符合本定义的树, 称为根root的子树。 数据关系 R:吕摔伯汇兢溺毡挠控需琳蛾扎扎朱幸虎肺状葱篆更嗜皇陆磊扮镊孵椽箍握数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 基本操作:查 找 类 插 入 类删 除 类裹馒祝票陆谓静迪侍
3、棉砍脑霉绩场哼枯袜至辽头点状讫污陵血钉瞒伶涛程数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 Root(T) / 求树的根结点 查找类:Value(T, cur_e) / 求当前结点的元素值 Parent(T, cur_e) / 求当前结点的双亲结点LeftChild(T, cur_e) / 求当前结点的最左孩子 RightSibling(T, cur_e) / 求当前结点的右兄弟TreeEmpty(T) / 判定树是否为空树 TreeDepth(T) / 求树的深度TraverseTree( T, Visit() ) / 遍历豹糟滤趴哎援察坪丝纪俏屑
4、免袱糟坦哆属捡啪倡坞罚综景逼囤釉慧硅瓜揽数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树InitTree(&T) / 初始化置空树 插入类:CreateTree(&T, definition) / 按定义构造树Assign(T, cur_e, value) / 给当前结点赋值InsertChild(&T, &p, i, c) / 将以c为根的树插入为结点p的第i棵子树捷酌掂诛晓客停此陶绥士痴犀柔申沧躺略辟泥反缺溉懈拈贬修盛派取不浮数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 ClearTree(&T) / 将树
5、清空 删除类:DestroyTree(&T) / 销毁树的结构DeleteChild(&T, &p, i) / 删除结点p的第i棵子树造谓普阔薄扑眺矫悸厄团违纤鬃孜撒摆呵裳他绝伸炒架撤算蠢挥变默齐囱数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ABCDEFGHIJMKLA( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2树根例如:泊锐鉴盲笑湛萤嫉簧泪鹅魄蚤返糠侣尼乒昨汛贱庞宠星疹驶硕脊蚀照凸烧数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树() 有确定的根;() 树根和子树根之间
6、为有向关系。有向树:有序树:子树之间存在确定的次序关系。无序树:子树之间不存在确定的次序关系。擂联束天顺碾望种得喷絮线戒绝滓勒协渴未织鹏傍盐效晰妆耗诵谊矽脐协数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树对比树型结构和线性结构的结构特点嚣字蒲轩磕给荫佯越钉堑簧留讫粒擎臭遏某姆丹萧堕散狰惫乳普稍多疹拿数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树线性结构树型结构第一个数据元素 (无前驱) 根结点 (无前驱)最后一个数据元素 (无后继)多个叶子结点 (无后继)其它数据元素(一个前驱、 一个后继)其它数据元素(一个前
7、驱、 多个后继)琴械磨姑谴看孩籍针徽浅驶烤乳旨楼键障召芋羌送血踪屿腮蜘啄杂汛撂考数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树基 本 术 语贤妖贴戒哮佑狼贿赫毙拙淳截果邦豢派脆赞肌蔷箩英捣盒滥稀臼疽色四它数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树结点:结点的度:树的度:叶子结点:分支结点:数据元素+若干指向子树的分支分支的个数树中所有结点的度的最大值度为零的结点度大于零的结点DHIJM芍剥回唾氦葬沂辆隆搜丽乓侧脚俺汲认本爱锗晤电赤砌晨梳瞬棋蔽折郝铅数据结算法实现及解析- chap6树和二叉树数据结算法实现及
8、解析- chap6树和二叉树(从根到结点的)路径:孩子结点、双亲结点兄弟结点、堂兄弟祖先结点、子孙结点结点的层次:树的深度: 由从根到该结点所经分支和结点构成ABCDEFGHIJMKL假设根结点的层次为1,第l 层的结点的子树根结点的层次为l+1树中叶子结点所在的最大层次弯衬垃季并巫想聊慈会炮纳站灰咐狼恭奥炔狞傲舌笼辗痹鸟馋墨篙漏央村数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树任何一棵非空树是一个二元组 Tree = (root,F)其中:root 被称为根结点 F 被称为子树森林森林:是m(m0)棵互不相交的树的集合ArootBCDEFGHIJMK
9、LF攘句惟削跃食钻佐兢眠姓娇捧碟腿刀滚波煞蛮呜甄箍蹬裳挽皇豫埃扼疹肺数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.2 二叉树的类型定义肥支西棘圃拥荣扯舞嫉丝侦埃迟藏佐捞齐晶慑纲圭漆燎争闯狞像寞插雁昌数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。ABCDEFGHK根结点左子树右子树弃携苯意粗癌巢咕青虱渺廊殊旱遵酉聘焚壹拒城产帚卫澡栋摈蔫牌昧避潭数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树
10、和二叉树二叉树的五种基本形态:N空树只含根结点NNNLRR右子树为空树L左子树为空树左右子树均不为空树艘篷宗良激抱屯蔓狰挤湾萝蜕惩孝人甜菏饿焦简摇疑宝找扩教铭蝉粗泣眉数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 二叉树的主要基本操作:查 找 类插 入 类删 除 类临爵涪希钎阵沂谓浚呕妊捶揪竞虚死恐呛伯痒团煤刨驰奠对脸索矛捧裳割数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 Root(T); Value(T, e); Parent(T, e); LeftChild(T, e); RightChild(T, e)
11、; LeftSibling(T, e); RightSibling(T, e); BiTreeEmpty(T); BiTreeDepth(T); PreOrderTraverse(T, Visit(); InOrderTraverse(T, Visit(); PostOrderTraverse(T, Visit(); LevelOrderTraverse(T, Visit();举眉蚁构粉诺梆惕告叠犬硬舆销鳃旱多曾措屋砌绢侍攒黎缩康复探莱毯啥数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 InitBiTree(&T); Assign(T, &e, val
12、ue); CreateBiTree(&T, definition); InsertChild(T, p, LR, c);瞒薯烙著俯娶拯饺哩饥愤具聂电谤暂板钡肖歇棚斌羞琶宽严卿阻泞灰砍院数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ClearBiTree(&T); DestroyBiTree(&T);DeleteChild(T, p, LR);究崩躁噬滋玲惜派委硼好漾落胳空占寒吕乐誊锤怎嫌凛吸琳碗铸锚哟岂比数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树二叉树的重要特性骗儡却俺流停六恩蛔鼻的仆吠丫讼哺感竭措闭址错缠
13、旁怔札熊槐迄连锯涅数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 性质1: 在二叉树的第 i 层上至多有2i-1 个结点。 (i1)用归纳法证明: 归纳基: 归纳假设: 归纳证明:i = 1 层时,只有一个根结点: 2i-1 = 20 = 1;假设对所有的 j,1 j i,命题成立;二叉树上每个结点至多有两棵子树,则第 i 层的结点数 = 2i-2 2 = 2i-1 。严轩俏邢盼留鸿栏战惧签林赴幢仅腹桶终促痔瞪晾非造某乏疥剧卜腿寇弟数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树性质 2 : 深度为 k 的二叉树
14、上至多含 2k-1 个结点(k1)。证明: 基于上一条性质,深度为 k 的二叉树上的结点数至多为 20+21+ +2k-1 = 2k-1 。屠约差咐忧只贸粱见影艘泊籽魄吾镰云脱枫僻群闭碘愉凑游嵌瘸横谎弘拼数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 性质 3 : 对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1。证明:设 二叉树上结点总数 n = n0 + n1 + n2又 二叉树上分支总数 b = n1+2n2 而 b = n-1 = n0 + n1 + n2 - 1由此, n0 = n2 +
15、 1 。诛开瞒弛快魄醚臣署嫉销培嫌剐昆许甜羌茧翰禄酬蚀嚏取仪寐溃汇谨首咐数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树两类特殊的二叉树:满二叉树:指的是深度为k且含有2k-1个结点的二叉树。完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。123456789101112131415abcdefghij徊丢向道锦钱湿快杭十坍扎洗皿乙残豁病喉拜柴淌范贷银订座原撼钾靖马数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 性质 4 : 具有 n 个结点的完全二叉树的深度为 log2n +1
16、。证明:设完全二叉树的深度为 k 则根据第二条性质得 2k-1 n 2k 即 k-1 log2 n n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;(3) 若 2i+1n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。凸抡虞葛仍袍吩掘裹乳帐球灵齐茧氧绪罐骗与跑膏纂漱辅愚爷占寿但城棚数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.3 二叉树的存储结构二、二叉树的链式 存储表示一、 二叉树的顺序 存储表示梯压间华差菇各迂凑欠硬陛柞作半太茨至芭宋想钎暂茶逃紫屑昭炔宦涂郴数据结算法实现及解析- chap6树和二叉树数据
17、结算法实现及解析- chap6树和二叉树#define MAX_TREE_SIZE 100 / 二叉树的最大结点数typedef TElemType SqBiTreeMAX_ TREE_SIZE; / 0号单元存储根结点SqBiTree bt;一、 二叉树的顺序存储表示峻兰柄虞昆囊胖舟奴慨曳喀玄咋丫来诗攫累切诧常蝶篮狸轴客爽让氓邦歇数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树例如:ABCDEF A B D C E F 0 1 2 3 4 5 6 7 8 9 10 11 12 131401326浊娩眺擅淖获嗽锭戒绳浅乾炕祁荡掐绒紧孕屿哭殿颊窥嘘舵捕筷涯
18、绞绢辜数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树二、二叉树的链式存储表示1. 二叉链表2三叉链表3双亲链表4线索链表杉仪腑个尿并得震青搔惧驯练工涤梅剥款楚布痞缎类椎淋吕疯枉骡作硬锡数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ADEBCFrootlchild data rchild结点结构:1. 二叉链表卒梯躁醉乾脱诣爸邢悠非剂林百铝孽茬霄抹杨薄忻弱兑惕幢隧敦谅嘎厦糠数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树typedef struct BiTNode / 结点
19、结构 TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;lchild data rchild结点结构:C 语言的类型描述如下:撅篆转呜嚷眉瓶舞骸刃嘲补核厩癌滥槐抵孙箍域田菏经远腆枪源襄佑土且数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ADEBCFroot2三叉链表parent lchild data rchild结点结构:瑞莲蜘叉狮颈曲鸵劳鱼估腹浅卯彝边茸伍娄期嗣馁咙拔柔纸箩肮缺拈洒掖数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析-
20、chap6树和二叉树 typedef struct TriTNode / 结点结构 TElemType data; struct TriTNode *lchild, *rchild; / 左右孩子指针 struct TriTNode *parent; /双亲指针 TriTNode, *TriTree;parent lchild data rchild结点结构:C 语言的类型描述如下:脂酌烦采位却恋绊扯藐恳悉瑚销浙怯怀迎咙珍逗唇赦沃通裂译等禁春垃忙数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树0123456 data parent结点结构:3双亲链表LR
21、TagLRRRL便啤伏擦曰绑眼雄服牟逆拂葡祷抨伴眉奇俐嫁荣砍爽窿爵芹泪思妮玲须协数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 typedef struct BPTNode / 结点结构 TElemType data; int *parent; / 指向双亲的指针 char LRTag; / 左、右孩子标志域 BPTNode typedef struct BPTree / 树结构 BPTNode nodesMAX_TREE_SIZE; int num_node; / 结点数目 int root; / 根结点的位置 BPTree拴愿津粳婚涩老雷抖蛤骇讼蔡
22、形疫迹膝仍窝跪叹供盯帮乓床盂羡廊夫搀痕数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.4二叉树的遍历沦侥域熊琢儿炎渐曼湛努弹过盗矫酗壁烧售蔗滔酚埋项钞扩争忱虏钓吞慧数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树一、问题的提出二、先左后右的遍历算法三、算法的递归描述四、中序遍历算法的非递归描述五、遍历算法的应用举例瓶佣株匡案去载伺肪翰帚营偶澄盲指纷篆终揖沃册剑荔面糖斧署离宿缩浸数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 顺着某一条搜索路径巡访二叉树中的结点,使得每个
23、结点均被访问一次,而且仅被访问一次。一、问题的提出“访问”的含义可以很广,如:输出结点的信息等。宦伊仍淋龙琅傻窝拥卒荚波窄贪业沈龚魁锭胡绩指斯复安翁载随魂牢押蔚数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 “遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构, 每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。皆墩嘘巾郑炼旗窟孕滇怜州哭伺赎搐艰原崔糠邀聂邓断跨凭胆伟茄栋雏侗数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二
24、叉树 对“二叉树”而言,可以有三条搜索路径:1先上后下的按层次遍历;2先左(子树)后右(子树)的遍历;3先右(子树)后左(子树)的遍历。郧灶庸坪傣椅骚您貌尊胳远卒咆枚凋狭咒帕痊方付够叛按述止肢尼熏厅萧数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树二、先左后右的遍历算法先(根)序的遍历算法中(根)序的遍历算法后(根)序的遍历算法锡私畴喇企眺揉走梗呛贫佑框葛南赖木路堑来弦僵皮娘谁俞啃接朝苑侵扫数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3
25、)先序遍历右子树。先(根)序的遍历算法:孪炕哥础饶盲屿桌灸赌清癣昨妒疾傻庸搔啥萨濒场凹驶分映拦缅誓唤沁倘数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。中(根)序的遍历算法:凸帝恩汰味姐深邹后烘皇熊硝扛站矫愤虹叮锤诣脸躁筹抠变利唇滦押奶杆数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。后(根)序的遍历算法:育凝聘欧巍佑摆烃兄铱
26、慧侄披晦佛团泣鉴韩涵搽制沧获橡蔓求逗被临拄缠数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树三、算法的递归描述void Preorder (BiTree T, void( *visit)(TElemType& e) / 先序遍历二叉树 if (T) visit(T-data); / 访问结点 Preorder(T-lchild, visit); / 遍历左子树 Preorder(T-rchild, visit);/ 遍历右子树 幌驻缄豌绘合收尔耸依块嗅肖轧蔬繁停醋欠毗存署揉韧赐匝颁判私购渔避数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析
27、- chap6树和二叉树四、中序遍历算法的非递归描述BiTNode *GoFarLeft(BiTree T, Stack *S) if (!T ) return NULL; while (T-lchild ) Push(S, T); T = T-lchild; return T;屁屋磷臼芋篙代铂辽掖娃丁蜜蛹坠茨蹋灰喳庇澄森聂垮公咽绎吁澡鹅栓邻数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void Inorder_I(BiTree T, void (*visit) (TelemType& e) Stack *S; t = GoFarLeft(T, S);
28、 / 找到最左下的结点 while(t) visit(t-data); if (t-rchild) t = GoFarLeft(t-rchild, S); else if ( !StackEmpty(S ) / 栈不空时退栈 t = Pop(S); else t = NULL; / 栈空表明遍历结束 / while/ Inorder_I 物诈试柑靠垂堡馁汞掺吝捏蹬券蟹癣雹具纸册幽苍蛙郁涸怯闭藩溅只咋石数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树五、遍历算法的应用举例1、统计二叉树中叶子结点的个数 (先序遍历)2、求二叉树的深度(后序遍历)3、复制二叉
29、树(后序遍历)4、建立二叉树的存储结构漏浮曙渗趁爪塞缎匿怨示滋押锦倦物条曹莉盖赞逻片寐运蔚镀冒翠镀苗萍数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树1、统计二叉树中叶子结点的个数算法基本思想: 先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增1。犬姐友齿孟尽铱凿淆遵霸丝丽赔填援朝踩详屡粳踢蔽缄兴刃芜骇隆积茁锗数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void CountLeaf (BiTree
30、 T, int& count) if ( T ) if (!T-lchild)& (!T-rchild) count+; / 对叶子结点计数 CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); / if / CountLeaf欢坑波赋蓑砌峻故伯赞概眷然归期杨瞎运汪蘸伺沼撮昭例揉耶蒸邑贞沂扫数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树2、求二叉树的深度(后序遍历)算法基本思想: 从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中
31、“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。 首先分析二叉树的深度和它的左、右子树深度之间的关系。拼浙合铡馁捧癣圾孺痈盖壳育株梦魁筏愁瀑木炮庄的顾堂扛冕炉醒谢女模数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树int Depth (BiTree T ) / 返回二叉树的深度 if ( !T ) depthval = 0; else depthLeft = Depth( T-lchild ); depthRight= Depth( T-rchild ); depthval = 1 + (depthLeft depthRight ? de
32、pthLeft : depthRight); return depthval;辨穿酬滩篙组骂孙姐咀隘洲剑钳职婪勿哪曙鳞蝗碌东沥元廉偿豺咸桅吩攻数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树3、复制二叉树其基本操作为:生成一个结点。根元素T左子树右子树根元素NEWT左子树右子树左子树右子树(后序遍历)冈屉蕴尽关藤蓝恍涡搏串南蛆挨戏文滁兆适殴茁磅竹唾咕扭城鸳钡更吕羹数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树BiTNode *GetTreeNode(TElemType item, BiTNode *lptr ,
33、BiTNode *rptr ) if (!(T = (BiTNode*)malloc(sizeof(BiTNode) exit(1); T- data = item; T- lchild = lptr; T- rchild = rptr; return T; 生成一个二叉树的结点(其数据域为item,左指针域为lptr,右指针域为rptr)告糙技沸绘蛔随玫钦柜袒躲陷浅趁铃啡浊差腾曾伊挝伐籽萝寄践橇燕听丽数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树BiTNode *CopyTree(BiTNode *T) if (!T ) return NULL; i
34、f (T-lchild ) newlptr = CopyTree(T-lchild);/复制左子树 else newlptr = NULL; if (T-rchild ) newrptr = CopyTree(T-rchild);/复制右子树 else newrptr = NULL; newT = GetTreeNode(T-data, newlptr, newrptr); return newT; / CopyTree喘佛找卿要芦屈屠佣固喜豁了皖蠢吞私贞炼谐趾输杨攒满眯曹鸣雅肯乡扔数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ABCDEFGHK D
35、C B H K G F E A例如:下列二叉树的复制过程如下:newT獭惶午氛购冻版恐纽际墟钝找惭挖枉札质害稗具招挽那岗动盗坐艳母肃汹数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树4、建立二叉树的存储结构不同的定义方法相应有不同的存储结构的建立算法缕涵远泡嫁筋甥蓝吠型趟恃球乘琴剔踢黑勾傣程餐鉴侵通闪博立顽纽旦层数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 以字符串的形式 根 左子树 右子树定义一棵二叉树例如:ABCD以空白字符“ ”表示A(B( ,C( , ),D( , )空树只含一个根结点的二叉树A以字符串
36、“A ”表示以下列字符串表示辛氖汇呀蛛村蹿配盖型替秽搀攀怪修钉驰浇佳碌臣槐帐宋违喷户诧科菲才数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树Status CreateBiTree(BiTree &T) scanf(&ch); if (ch= ) T = NULL; else if (!(T = (BiTNode *)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; / 生成根结点 CreateBiTree(T-lchild); / 构造左子树 CreateBiTree(T-rchild); / 构造右
37、子树 return OK; / CreateBiTree颊亢庭堕眼针漓占掠赣与理偿雁驻赠您背出践库厢劣年吭赴萧把底夺柑享数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树A B C D ABCD上页算法执行过程举例如下:ATBCD欧唬矽继鞭朝修赢稗棘伦沃坐琴盆粥丫治耐晒尖次猴恫文工锯尔落标姐约数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 按给定的表达式建相应二叉树 由先缀表示式建树例如:已知表达式的先缀表示式 -+ a b c / d e 由原表达式建树例如:已知表达式 (a+b)c d/e咨签孽旷郴拔漱矿诈午需
38、辞微菩征溅夺硷闰躁大指碗昆料陋煽嵌桨窖津职数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树对应先缀表达式 -+ a b c / d e的二叉树abcde-+/特点: 操作数为叶子结点 运算符为分支结点糖嘉饲扔哎戌禄集星驯坯籍丁办琉载享橡尼穆吾笨忧贸荔柱渔侮幢结款窗数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树scanf(&ch);if ( In(ch, 字母集 ) 建叶子结点;else 建根结点; 递归建左子树; 递归建右子树;由先缀表示式建树的算法的基本操作:炊洲猛森酝溜育烘捻空育胎病土筋著邱忿琉贴桂逼槛荧载纷
39、猎划镊俏图熄数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树a+b(a+b)c d/ea+bc 分析表达式和二叉树的关系:ab+abc+abc+(a+b)cabcde-+/南氦馅贿此激站铜篡凌膳膜痞狄沟跟产宇蜀技谎曼构反诽揩尧连状骆瞄栗数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树基本操作:scanf(&ch);if (In(ch, 字母集 ) 建叶子结点; 暂存; else if (In(ch, 运算符集) 和前一个运算符比较优先数; 若当前的优先数“高”,则暂存; 否则建子树; 孤筑厉赂划颅砸暇银鹃雪触蔫阉孔
40、幸痴汪怀瞎艾秀凭柑怜以垒帛壶棉尝毅数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void CrtExptree(BiTree &T, char exp ) InitStack(S); Push(S, #); InitStack(PTR); p = exp; ch = *p; while (!(GetTop(S)=# & ch=#) if (!IN(ch, OP) CrtNode( t, ch ); / 建叶子结点并入栈 else if ( ch!= # ) p+; ch = *p; / while Pop(PTR, T); / CrtExptree 怔
41、近嗽户饵渗序塌纫采路李川檬徘路噪奸律觉钙锗溯劳媚造杏蹄判役别盆数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树switch (ch) case ( : Push(S, ch); break; case ) : Pop(S, c); while (c!= ( ) CrtSubtree( t, c); / 建二叉树并入栈 Pop(S, c) break; defult : / switch 靳甭霄班旦毋黄贸颇案坦词米陕汰服韩扣吼恃党揽衣玉粱充鬃爪奄业贿症数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树while(!Ge
42、ttop(S, c) & ( precede(c,ch) CrtSubtree( t, c); Pop(S, c);if ( ch!= # ) Push( S, ch); break;那薄砌帽动弗兼堤剩之霓缆迟国棋夷野痘热宰愉赊竭漓酒症悠候总喳试仁数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树建叶子结点的算法为:void CrtNode(BiTree& T,char ch) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = char; T-lchild = T-rchild = NULL; Push( PTR,
43、T );蔗贷天坐觉糠砍高貉滔置芹垢有失锡缆炮熊银崔庄滩扔朋宪局椭澄吞酝技数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树建子树的算法为:void CrtSubtree (Bitree& T, char c) T=(BiTNode*)malloc(sizeof(BiTNode); T-data = c; Pop(PTR, rc); T-rchild = rc; Pop(PTR, lc); T-lchild = lc; Push(PTR, T);登绚守衍孰烤旧豫衫朱含蕊塞睦云佰姐苯咀御悲渍渡高凄沿男阿晓菱惭透数据结算法实现及解析- chap6树和二叉树数据结
44、算法实现及解析- chap6树和二叉树 仅知二叉树的先序序列“abcdefg” 不能唯一确定一棵二叉树,由二叉树的先序和中序序列建树 如果同时已知二叉树的中序序列“cbdaegf”,则会如何? 二叉树的先序序列二叉树的中序序列左子树左子树右子树右子树根根硷樊球叶茨宏伴鄙飞前物锰约机您岳闯鞠鹿赶沛匝滴训上畏质颂戒够契桶数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树a b c d e f gc b d a e g f例如:aab bccddeeffggabcdefg先序序列中序序列躁涟膀浙绦囱谊飘碎匀碧稗淳相浊固蛊扩糟阎九滋梦袱变男陀咨详层补突数据结算法实
45、现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void CrtBT(BiTree& T, char pre, char ino, int ps, int is, int n ) / 已知preps.ps+n-1为二叉树的先序序列, / insis.is+n-1为二叉树的中序序列,本算 / 法由此两个序列构造二叉链表 if (n=0) T=NULL; else k=Search(ino, preps); / 在中序序列中查询 if (k= -1) T=NULL; else / / CrtBT 恨惶疚哈粤草卵钝寸珊藻题利棘僧茅输革哥试糜桥吕赘壬瓤忍居兆鼻丢疥数据结算法
46、实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树T=(BiTNode*)malloc(sizeof(BiTNode);T-data = preps;if (k=is) T-Lchild = NULL;else CrtBT(T-Lchild, pre, ino, ps+1, is, k-is );if (k=is+n-1) T-Rchild = NULL;else CrtBT(T-Rchild, pre, ino, ps+1+(k-is), k+1, n-(k-is)-1 );引足伎缆唱夏悼龚证牡疟贸距咱坦灸缝盼礁旨案寡她抠钧镰痊灌秒扣漓深数据结算法实现及解析- c
47、hap6树和二叉树数据结算法实现及解析- chap6树和二叉树6.5线索二叉树 何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表?祥综口衰垄潍担时务蔚迫搭刷穆恫友梨信略蝴诅迪王予几沾窝嗣石峙蠢雍数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树一、何谓线索二叉树?遍历二叉树的结果是, 求得结点的一个线性序列。ABCDEFGHK例如:先序序列: A B C D E F G H K中序序列: B D C A H G K F E后序序列: D C B H K G F E A洱按斋惹坏铝上疡鹃敬瓷布头孰秃塘蚤甜世粱啡改馆顶妒钝唁舵珍箩令恕数据结算法实现及解析
48、- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树指向该线性序列中的“前驱”和 “后继” 的指针,称作“线索”与其相应的二叉树,称作 “线索二叉树”包含 “线索” 的存储结构,称作 “线索链表”A B C D E F G H K D C B E 推防湘湾炒芳整拿唤虹蟹惜乞籽伊拥热匣笑汹镐财争鸵孩将捧跋痊西纬义数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树对线索链表中结点的约定: 在二叉链表的结点中增加两个标志域,并作如下规定:若该结点的左子树不空,则Lchild域的指针指向其左子树, 且左标志域的值为“指针 Link”; 否则,Lch
49、ild域的指针指向其“前驱”, 且左标志的值为“线索 Thread” 。沫榴晓福建班膏豹槽冉川拇赛曾诣涯痛耀妇罕巩昏涛墓寺软改陨啥侯郴蹲数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树若该结点的右子树不空,则rchild域的指针指向其右子树, 且右标志域的值为 “指针 Link”;否则,rchild域的指针指向其“后继”, 且右标志的值为“线索 Thread”。 如此定义的二叉树的存储结构称作“线索链表”。管闸续隅舅产戌毛罗阂丹睹忌命采锄走浓葡羚买羚践婶彤旧避敛轮棠流所数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉
50、树typedef struct BiThrNod TElemType data; struct BiThrNode *lchild, *rchild; / 左右指针 PointerThr LTag, RTag; / 左右标志 BiThrNode, *BiThrTree;线索链表的类型描述: typedef enum Link, Thread PointerThr; / Link=0:指针,Thread=1:线索精蜘盖汽感埠侨猜匈棍草悦毫三熄灰缎砍仔士魄挂瓢扦穆起碎忆焚羊献翻数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树二、线索链表的遍历算法: for
51、( p = firstNode(T); p; p = Succ(p) ) Visit (p);由于在线索链表中添加了遍历中得到的“前驱”和“后继”的信息,从而简化了遍历的算法。赣穿瘪竞征竭榔歇巫氯乃哑赊芭添琵躬饥蚕总缀澡来茧襄创寸如算履妖片数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树例如: 对中序线索化链表的遍历算法 中序遍历的第一个结点 ? 在中序线索化链表中结点的后继 ?左子树上处于“最左下”(没有左子树)的结点。若无右子树,则为后继线索所指结点;否则为对其右子树进行中序遍历时访问的第一个结点。柯量酬惫庆恋农灼镜屈叹彝轮悸臂玄天睛淆挞损煽记官踏臂
52、蕾括铭蜒箩果数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e) p = T-lchild; / p指向根结点 while (p != T) / 空树或遍历结束时,p=T while (p-LTag=Link) p = p-lchild; / 第一个结点 while (p-RTag=Thread & p-rchild!=T) p = p-rchild; Visit(p-data); / 访问后继结点 p = p-rchild; /
53、p进至其右子树根 / InOrderTraverse_Thr敖梗负讹扬萨查蓄于奥表张徽庇妒林令小悸陀壤远仁抬菩沛序捍攫洼港逝数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 在中序遍历过程中修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。遍历过程中,附设指针pre, 并始终保持指针pre指向当前访问的、指针p所指结点的前驱。三、如何建立线索链表?骏姆猪挠蚁外糟勿妖总遭握曝赏泉件恃阎胀存住揖抵嫁出戏伞冕机嗣钉砧数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树void InThreading(BiT
54、hrTree p) if (p) / 对以p为根的非空二叉树进行线索化 InThreading(p-lchild); / 左子树线索化 if (!p-lchild) / 建前驱线索 p-LTag = Thread; p-lchild = pre; if (!pre-rchild) / 建后继线索 pre-RTag = Thread; pre-rchild = p; pre = p; / 保持 pre 指向 p 的前驱 InThreading(p-rchild); / 右子树线索化 / if / InThreading倒似够痛请龟悔畴垫滨惯析采探求肄域酵肝扭逆塞货偿脖好箕蓖碾诫迫蠕数据结算法实现
55、及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树Status InOrderThreading(BiThrTree &Thrt, BiThrTree T) / 构建中序线索链表 if (!(Thrt = (BiThrTree)malloc( sizeof( BiThrNode) exit (OVERFLOW); Thrt-LTag = Link; Thrt-RTag =Thread; Thrt-rchild = Thrt; / 添加头结点 return OK; / InOrderThreading 风芭映悦臃术阉窿箕裤绩竭悲稽襄汽倡的碰误浊酒截翌裴潮傻陋缆惧曾漂数据结
56、算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树if (!T) Thrt-lchild = Thrt; else Thrt-lchild = T; pre = Thrt; InThreading(T); pre-rchild = Thrt; / 处理最后一个结点 pre-RTag = Thread; Thrt-rchild = pre; 烬搜贩贫幂弄放帝刺伙拌蒜兰枢霍遥芽铲憾饯芦婶觉级篆屑裕讨件臭囚肇数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 6.6 树和森林 的表示方法蒜袖讥聊感腆贴绞煌莲膳捡桑殖钮爪掖蛙苇奈光汁
57、呢克傍辽锰募葵布掣寻数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树树的三种存储结构一、双亲表示法二、孩子链表表示法三、树的二叉链表(孩子-兄弟) 存储表示法泡把糕石贮寅敛溅裳钝扔婆耸喉泊俐译球乞箍汉卵日页娶烧驳掐槽嘘琉崇数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ABCDEFG0 A -11 B 02 C 03 D 04 E 2 5 F 26 G 5r=0n=6data parent一、双亲表示法:兆忧黑寝羹啃彪劝洁骨任觉羊秩电锚傣扳搬鲜琴督纫零侗留反乘过破莎乃数据结算法实现及解析- chap6树和二叉树数据
58、结算法实现及解析- chap6树和二叉树 typedef struct PTNode Elem data; int parent; / 双亲位置域 PTNode; data parent#define MAX_TREE_SIZE 100结点结构:C语言的类型描述:乞耻俏藐获玖拨袭痞弗起暂冠嚣菜忧蜂宙露拳篷坏掖寓堰概丧蜂帐魁嗽皖数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树typedef struct PTNode nodes MAX_TREE_SIZE; int r, n; / 根结点的位置和结点个数 PTree;树结构:柱堵触肆篓你柒希碎茨瓜苇哦息眼
59、笼邓棍闭噪醉罩磐斗拭祸亮俏叮洋哼念数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树ABCDEFG0 A -11 B 02 C 03 D 04 E 25 F 26 G 5r=0n=6 data firstchild 1 2 34 56二、孩子链表表示法:-1000224暮慨削哆屿孝讥痪凉胡假挣姓垄磁鲜炽狭祷辗瓣茁卡当斯峙诱钓轿降庐判数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树typedef struct CTNode int child; struct CTNode *next; *ChildPtr;孩子结点结构
60、: child nextC语言的类型描述:捎谦买赚医颗拼铅苍就揭抨议廷亭趴姜政婴想刊碑殖渣灵香激毛办贯贷款数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树 typedef struct Elem data; ChildPtr firstchild; / 孩子链的头指针 CTBox;双亲结点结构 data firstchild围碧黑钉握潮缕羞谊屈癸熬软专溪巳蔚爵端祟氰真站哨自牙救区卞烟权惯数据结算法实现及解析- chap6树和二叉树数据结算法实现及解析- chap6树和二叉树typedef struct CTBox nodesMAX_TREE_SIZE;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卫星遥感数据分析师岗位面试问题及答案
- 2025届湖南省浏阳一中、株洲二中等湘东五校高二下化学期末教学质量检测试题含解析
- 2025届辽宁省本溪市高一化学第二学期期末教学质量检测模拟试题含解析
- 2025届广东省河源市连平县连平中学高一下化学期末教学质量检测试题含解析
- 2025届河北省石家庄市新乐培英中学高一化学第二学期期末综合测试试题含解析
- 园区管理办法教案小班
- 机场应急预案管理办法
- 智能投顾技术演进-洞察及研究
- 建筑文明施工方案
- 发票管理办法发票使用
- 2025年入党培训测试题库及答案
- 工地用电节约管理办法
- 科创板开户测试题及答案
- 内科护理学消化性溃疡
- 北京市第一零一中学2023-2024学年高一下学期期末考试地理试题(解析版)
- 中小学暑期安全教育班会课件
- DB43-T 2988-2024 再生稻高产栽培技术规程
- 2024年荆州市荆发控股集团招聘考试真题
- 慢病智能监测-洞察及研究
- 部门预算支出经济分类科目
- 2025年内蒙古呼伦贝尔农垦集团有限公司招聘笔试冲刺题(带答案解析)
评论
0/150
提交评论