线索二叉树的创建及遍历(C语言实现)
本身是一种非线性结构,采用任何一种遍历二叉树的方法,都可以得到树中所有结点的一个线性序列。在这个序列中,除第一个结点外,每个结点都有自己的直接前趋;除最后一个结点外,每个结点都有一个直接后继。
线索二叉树不需要如此,在遍历的同时,使用二叉树中空闲的内存空间记录某些结点的前趋和后继元素的位置(不是全部)。这样在算法后期需要遍历二叉树时,就可以利用保存的结点信息,提高了遍历的效率。使用这种方法构建的二叉树,即为
线索二叉树的结点结构如果在二叉树中想保存每个结点前趋和后继所在的位置信息,最直接的想法就是改变结点的结构,即添加两个指针域,分别指向该结点的前趋和后继。但是这种方式会降低树存储结构的存储密度。而对于二叉树来讲,其本身还有很多未利用的空间。
存储密度指的是数据本身所占的存储空间和整个结点结构所占的存储量之比。每一棵二叉树上,很多结点都含有未使用的指向NULL的指针域。除了度为2的结点,度为 1 的结点,有一个空的指针域;叶子结点两个指针域都为NULL。
链表中必定存在 n+1 个空指针域。线索二叉树实际上就是使用这些空指针域来存储结点之间前趋和后继关系的一种特殊的二叉树。
线索二叉树中,如果结点有左子树,则 lchild 指针域指向左孩子,否则 lchild 指针域指向该结点的直接前趋;同样,如果结点有右子树,则 rchild 指针域指向右孩子,否则 rchild 指针域指向该结点的直接后继。为了避免指针域指向的结点的意义混淆,需要改变结点本身的结构,增加两个标志域,如图 2 所示。
图2 线索二叉树中的结点结构LTag 和 RTag 为标志域。实际上就是两个布尔类型的变量:
线索化。对二叉树进行线索化将二叉树转化为线索二叉树,实质上是在遍历二叉树的过程中,将二叉链表中的空指针改为指向直接前趋或者直接后继的线索。
线索化的过程即为在遍历的过程中修改空指针的过程。在遍历过程中,如果当前结点没有左孩子,需要将该结点的 lchild 指针指向遍历过程中的前一个结点,所以在遍历过程中,设置一个指针(名为 pre ),时刻指向当前访问结点的前一个结点。代码实现(拿中序遍历为例)://中序对二叉树进行线索化 void InThreading(BiThrTree p){ //如果当前结点存在 if (p) { InThreading(p-lchild);//递归当前结点的左子树,进行线索化 //如果当前结点没有左孩子,左标志位设为1,左指针域指向上一结点 pre if (!p-lchild) { p-Ltag=Thread; p-lchild=pre; } //如果 pre 没有右孩子,右标志位设为 1,右指针域指向当前结点。 if (!pre-rchild) { pre-Rtag=Thread; pre-rchild=p; } pre=p;//线索化完左子树后,让pre指针指向当前结点 InThreading(p-rchild);//递归右子树进行线索化 } }注意:中序对二叉树进行线索化的过程中,在两个递归函数中间的运行程序,和之前介绍的中序遍历二叉树的输出函数的作用是相同的。
将中间函数移动到两个递归函数之前,就变成了前序对二叉树进行线索化的过程;后序线索化同样如此。
使用线 中是一个按照中序遍历建立的线索二叉树。其中,实线表示指针,指向的是左孩子或者右孩子。虚线表示线索,指向的是该结点的直接前趋或者直接后继。
使用线索二叉树时,会经常遇到一个问题,如图 3 中,结点 b 的直接后继直接通过指针域获得,为结点 * ;而由于结点 * 的度为 2 ,无法利用指针域指向后继结点,整个链表断掉了。当在遍历过程,遇到这种问题是解决的办法就是:
寻找先序、中序、后序遍历的规律,找到下一个结点。在先序遍历过程中,如果结点因为有右孩子导致无法找到其后继结点,如果结点有左孩子,则后继结点是其左孩子;否则,就一定是右孩子。拿图 3 举例,结点 + 的后继结点是其左孩子结点 a ,如果结点 a 不存在的话,就是结点 * 。
相关文章:
- [军事新闻]卷帘绿魔易爆点这是个什么梗?
- [军事新闻]关于生生世世只爱你到底怎么回
- [军事新闻]山东大鼓老来难真的假的?
- [军事新闻]不倒翁摩托车网友怎么看?
- [军事新闻]范冰冰周渝民到底是什么情况?
- [军事新闻]关于现代新雅尊详情介绍!
- [军事新闻]有关木管组有什么乐器背后的逻
- [军事新闻]黄光裕得罪了谁具体内容是什么
- [军事新闻]重阳节的来历和习俗是什么原因
- [军事新闻]有关再就业优惠证到底是什么情
- [军事新闻]穷小子的超级成长怎么回事?
- [军事新闻]关于恶魔总裁求你别碰我究竟是
- [军事新闻]关于春心莫共花争发下一句是怎
- [军事新闻]有关青盲剧情介绍网友怎么看?
- [军事新闻]情逆三世缘剧情介绍真的还是假
- [军事新闻]有关罗百吉好听的歌网友是怎么
- [军事新闻]我可以摸你的胸吗具体内容!
- [军事新闻]有关真爱百万新娘第二部究竟什
- [军事新闻]有关歌兰蒂斯的谢礼究竟什么原
- [军事新闻]上党落子灵堂计具体情况是什么
- 1~8月南通全市工业投资稳健增长 亿元以上工业项目产出
- 4080显卡需要多少w电源笔记本什么时候出?
- 加盟商百万欠款难追回 鱼乐贝贝“加盟圈套”何时终结
- 面瘫将军求子记具体内容是什么?
- 值得但非首选]雷克萨斯NX200t两年详细使用感受
- 有关五行带土的字的底层逻辑是什么?
- 【雄关善治·五治融合】“五治融合”绘就和谐画卷——
- 湖北奥运冠军谌龙喜获赛季首冠 感叹坚持终于有了回报
- 华为美国子公司计划大规模裁员 中国雇员可回国并留在
- 淘宝分期付款(淘宝上如何分
- 青海小西牛生物乳业股份有限公司
- 易方达天天理财货币A
- 唇唇欲动无影有踪是真的吗?
- 关于魔少的逃跑俏新娘又是什么梗?
- b是什么车标
- 斧头男大砍麦当劳事后操作更令人脊背发凉
- 美格智能技术股份有限公司第二届监事会第十次会议决议
- ROG6天玑版成安卓旗舰手机性能第一?真实用户评价亮了
- 改装档案BMW R nine T真是怎么改都好看!看看印度改出
- 第七届中国-亚欧博览会透露哪些积极信号?
- 人均一块金牌C-ECAP中国生态汽车评价规程有点尬|聚侃
- 宣城街头隔离栏开口变
- 儒博荣获AI+垂直行业最具投资价值奖坚定以AI赋能教育
- 鞍山繁荣夜经济释放经济增长新动能
- 万方医学网-医学专业信息服务提供商
- 刘安现磨豆浆网友会怎么评论?
- 金迈驰节油器这又是个什么梗?
- 习近平:在第十三届全国人民代表大会第一次会议上的讲
- 有关祁对症下药(duì zhèng xià yào)网友关心什么
- 关于充气娃娃之恋qvod这是个什么梗?
- 失宠少奶奶具体内容是什么?
- 深化增值税改革首月减税超千亿制造业居首
- “祖国昌盛七十春 书画公益展新篇” 筑梦大爱路翰墨笔
- 182个大棚被大风摧毁 部分兰考蜜瓜急等您品尝
- 【逗号游戏解说】我的世界Minecraft纯零生存第一季4│
- 霍顿开口了:队友服用禁药让我失望支持对她禁赛
- 维瓦尔第四季最新消息!
- 咬洱(ěr)千秋万代真的假的?
- 诛仙月宫祝福具体内容!
- 《破冰行动》“烂尾” 豆瓣评分跌至74导演道歉