一棵二叉树的中根线索二叉树_#图解 数据结构:轻松搞定线索二叉树

d4c58e08d03da5ff80b056f12c1b8204.png

更新:

为了让文章篇幅不太长,我将指针的引用部分另外写成了一篇文章。

如果有需要,还请自行踱步。

Nice小夫:#图解 轻松看懂指针的引用*&​zhuanlan.zhihu.com
8f5b221ec9ce097f4c4ed73585358368.png

什么是线索二叉树?

线索二叉树分为三类:

55883eaf06e61824d5fe8c252048cc87.png

对一棵二叉树中所有节点的空指针域按照某种遍历方式加线索的过程叫作线索化,被线索化了的二叉树称为线索二叉树。

为什么需要线索二叉树?

知道了“前驱”和“后继”信息,就可以把二叉树看作一个链表结构,从而可以像遍历链表那样来遍历二叉树,进而提高效率

如何线索化二叉树

这里例举了中序线索二叉树的方法

一个二叉树通过如下的方法“串起来”

所有原本为空的右(孩子)指针改为指向该节点在中序序列中的后继,所有原本为空的左(孩子)指针改为指向该节点的中序序列的前驱。

这句话我是借鉴了了另一位知友的总结,可以说是一看就懂了。

但我并不满足于此,我要让这句话更加直观展现出来。

fa54562b5051d7516bc5a0a51de603ab.png

我这个图这样直观展示,是有意为之的。

让你看到左孩子空,就会想到直接前驱右孩子空,就会想到直接后继

线索二叉树的结构

daa5690e90c782bcd4bd8466e536a70b.png
线索二叉树节点结构

标识域:

  1. 如果ltag=0,表示指向节点的左孩子。如果ltag=1,则表示lchild为线索,指向节点的直接前驱
  2. 如果rtag=0,表示指向节点的右孩子。如果rtag=1,则表示rchild为线索,指向节点的直接后继

什么是前驱后继,不需要我解释了吧。

所以对应的线索二叉树的节点定义如下:

typedef 

ebd60057f46d9657a3ad2f938fbcc6ba.png
中序线索二叉树

aeb1141e1e1da703af4cbcfbce00e54f.png
二叉链表表示

我们心目中的代码就是要将中序线索二叉树用二叉链表来实现。

我们来一步一步的书写代码:

约定:

  • 指针p指向当前正在访问的节点
  • pre指向p的前驱节点
// 通过中序遍历对二叉树线索化的递归算法:

通过中遍历建立中序线索二叉树的主要程序

// 通过中遍历建立中序线索二叉树的主要程序

遍历中序线索二叉树

求以p为根的中序线索二叉树中,中序序列下的第一个节点。

TBNode 

求在中序线索二叉树中,节点p在中序下的后继节点。

TBNode 

中序线索二叉树上执行中序遍历的算法

void 

剩下的前序线索二叉树遍历和后序线索二叉树,套路还不是一样一样的?


我的更多图解教程:

Nice小夫:#图解 数据结构:树的存储结构​zhuanlan.zhihu.com
4809bf25f793a6ac00175746e72696e9.png
Nice小夫:#图解 数据结构:树和森林与二叉树的相互转换​zhuanlan.zhihu.com
43376731d428f377752dc960d7cea027.png
Nice小夫:#图解+动画 数据结构-循环链表:约瑟夫环问题(C语言实现)​zhuanlan.zhihu.com
3d37b474f14a6f06f5a46f3d1b7a6929.png
Nice小夫:#动画 算法初步:选择排序。过于简单!​zhuanlan.zhihu.com
4d1ea89dd0b8ce996df3f5f1c02ad44c.png
Nice小夫:#图解 必胜之策!生活中的博弈论:抓三堆问题。这四张图让你懂得一塌糊涂​zhuanlan.zhihu.com
081c89d1458d852eaef4db507c0dd0d4.png
Nice小夫:#图解+动画 不败法则!生活中的博弈论:简简单单躺赢。一张图让你彻彻底底搞明白!​zhuanlan.zhihu.com
fde9bca0a4d4e217b131a44af7d1fc76.png
Nice小夫:#图解 考研英语语法:状语从句​zhuanlan.zhihu.com
60ff3db36066908c4401e96e6beffbde.png
Nice小夫:#图解 考研英语语法:名词性从句​zhuanlan.zhihu.com
dd4c2f49107de60b1ffb9819bfee3bee.png

Nice!Nice!Nice!

明白啦。

4ac1c6ac73e4f27d4603d8ace7afdb53.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值