线索二叉树(图解+完整代码)

17 篇文章 37 订阅
订阅专栏

目录

⚽1.问题

🏐2.线索化

🏀 3.线索化带来的问题与解决

🥎4.完整代码


1.问题

我们的二叉树学到现在,会产生两个问题:

  • 在n个结点的二叉树中,必定有n+1个空链域(叶子结点的左右子树空间浪费了)
  • 二叉树的遍历,无论是递归还是非递归算法,效率都不算高。

那我们能不能利用原本浪费掉的空间,来解决第二个问题呢?

倘若对下图二叉树进行中序遍历,可以得到1、3、6、8、10,我们可以知道3的前驱结点为1,后驱结点为6。但是,这种关系的建立是在完成遍历后得到的,那么,可不可以在建立二叉树的同时记录下前驱后继的关系,这样我们在寻找前驱后继结点时的效率将会大大提升!

我们的前辈们给出了答案:线索化 

🏐2.线索化

现将某结点的空指针域指向该结点的前驱后继,定义规则如下:

  • 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点
  • 若结点的右子树为空,则该结点的右孩子指针指向其后继结点

这种指向前驱和后继的指针称为线索,将一棵普通的二叉树以某种次序遍历,并添加线索的过程称为线索化。

🏀 3.线索化带来的问题与解决

此时新的问题又产生了:我们如何区分一个lchild指针是指向左孩子还是前驱结点呢?

为了解决这个问题,我们需要添加标志位ltag和rtag,并定义以下规则

  • ltag==0,指向左孩子;ltag==1,指向前驱结点
  • rtag==0,指向右孩子;rtag==1,指向后继结点

🥎4.完整代码

中序线索化

void inOrderThreadTree(Node* node)
{
	//如果当前结点为NULL 直接返回
	if (node == NULL) {
		return;
	}
	//先处理左子树
	inOrderThreadTree(node->left_node);
	if (node->left_node == NULL)
	{
		//设置前驱结点
		node->left_type = 1;
		node->left_node = pre;
	}
	//如果结点的右子节点为NULL 处理前驱的右指针
	if (pre !=NULL && pre->right_node == NULL)
	{
		//设置后继
		pre->right_node = node;
		pre->right_type = 1;
	}
	//每处理一个节点 当前结点是下一个节点的前驱
	pre = node;
	//最后处理右子树
	inOrderThreadTree(node->right_node);
}

遍历

void inOrderTraverse(Node* root)
{
	//从根节点开始先找到最左边
	if (root == NULL)
	{
		return;
	}
	Node* temp = root;
	//先找到最左边结点 然后根据线索化直接向右遍历
	while (temp != NULL && temp->left_type == 0)
	{
		temp = temp->left_node;
	}
	while (temp != NULL)
	{
		//输出
		temp = temp->right_node;
	}
}

完整代码

#include<stdio.h>
#include<stdlib.h>
typedef struct Thread {
	struct Thread* left_node, *right_node;//左右指针
	int data;//需要存放的数据
	/*默认0代表左右孩子 1代表前驱或者后继*/
	int left_type;//类型标志
	int right_type;//类型标志
}Node;

Node* pre;//前驱结点的变量
Node* head;//头指针 指向某种遍历的第一个结点

void inOrderThreadTree(Node* node)
{
	//如果当前结点为NULL 直接返回
	if (node == NULL) {
		return;
	}
	//先处理左子树
	inOrderThreadTree(node->left_node);
	if (node->left_node == NULL)
	{
		//设置前驱结点
		node->left_type = 1;
		node->left_node = pre;
	}
	//如果结点的右子节点为NULL 处理前驱的右指针
	if (pre !=NULL && pre->right_node == NULL)
	{
		//设置后继
		pre->right_node = node;
		pre->right_type = 1;
	}
	//每处理一个节点 当前结点是下一个节点的前驱
	pre = node;
	//最后处理右子树
	inOrderThreadTree(node->right_node);
}

void inOrderTraverse(Node* root)
{
	//从根节点开始先找到最左边
	if (root == NULL)
	{
		return;
	}
	Node* temp = root;
	//先找到最左边结点 然后根据线索化直接向右遍历
	while (temp != NULL && temp->left_type == 0)
	{
		temp = temp->left_node;
	}
	while (temp != NULL)
	{
		//输出
		temp = temp->right_node;
	}

}

关于线索二叉树的详解
kcy的博客
11-16 1万+
线索二叉树的详解 目录线索二叉树的详解前言一、线索二叉树是什么?三种二叉树线索化实例图二、实现线索二叉树1.二叉树的线索化2.线索二叉树的遍历中序线索二叉树寻找遍历的首节点中序线索二叉树寻找节点的直接后继遍历中序线索二叉树总结 前言 学了二叉树,我们发现,对二叉树的遍历是一个比较复杂的问题,需要用到递归或者栈才可以进行遍历,这样子的遍历实质上就是将二叉树化为一个有序的线性序列,在这个序列中,每一个节点有且只有一个前继节点(第一个节点除外),和一个后继节点(最后一个节点除外),但是这些节点不能直接的找到当
线索二叉树的遍历
01-17
线索二叉树的先序,中序,后序遍历完整代码,在vs2013下编译通过
数据结构(五)——二叉树的遍历和线索二叉树
最新发布
señoritaw的博客
03-23 1114
普通二叉树进行遍历时,找前驱、后继很不方便,且每次都要从根结点出发,无法从一个指定的结点开始遍历​​​​​​​​​​​​​​。tag == 1 时,表示指针是“线索”。②若 p->rtag==0,则 next = p 的右子树中最左下结点。①若 p->rtag==1,则 next = p->rchild。①若 p->rtag==1,则 next = p->rchild。①若 p->ltag==1,则 next = p->lchild。①若 p->rtag==1,则 next = p->rchild。
树(四)——线索二叉树
在校生
11-19 6078
树(四)——线索二叉树c语言
数据结构】树-线索二叉树(动态图解、c++、java)
扑腾的江鱼复习仓库
03-01 2291
URLeisure的线索二叉树“完美”复习资料。
线索二叉树详解 - C语言
友人帐_的博客
10-26 4841
介绍了线索二叉树的概念及数据结构,分析了优缺点。并给出中序遍历线索化的示例,指出线索二叉树的一些应用。
【考研】数据结构——线索二叉树
qq_34438969的博客
09-20 3701
本文内容源于对《数据结构C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结。本文针对线索二叉树,在最后的练习中,以举例子说明该排序方法,配以图文,讲解详细(含408真题)。【考研】《数据结构》知识点总结.pdf_考研-其它文档类资源-CSDN下载【2023考研】数据结构常考应用典型例题(含真题)_住在阳光的心里的博客-CSDN博客//二叉树的二又线索存储表示以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针,叫做线索。
数据结构线索二叉树详细解释
热门推荐
m0_61886762的博客
05-02 2万+
1.1 线索二叉树的原理 我们现在倡导节约型社会,一切都应该以节约为本。但当我们创建二叉树时我们会发现其中一共有两个指针域,有的指针域指向的结构为空,这也就浪费了很多空间
线索二叉树(线索链表遍历,二叉树线索化)
m0_63223213的博客
07-27 4836
特别的是,对于D和F,D是中序遍历的开头结点,它没有前驱节点;F是中序遍历的结尾的结点,它没有后继节点,那么这时,寻找的规则是,如果结点的Ltag==1代表可以直接找到前驱节点;由下图可见,有的左右指针是连接的子树,没有链接左右子树的指针现在就通过红色的虚线指向了该结点的前驱或者后继。可以发现,相较于原来的二叉链表,这里在数据结构里添加了两个int类型,来规定左右指针的作用。再通过以下步骤创建一个线索二叉树(下图是中序线索二叉树的结构示意)线索二叉树,即在二叉链表的基础上,将二叉链表的。...
线索化二叉树的作用
学Java,找哪吒
08-16 1万+
一、先看一个问题 将数列{1,3,6,8,10,14}构建成一颗二叉树。 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为{8,3,10,1,6,14}。 但是6,8,10,14这几个节点的左右指针,并没有完全的利用上。 如果我们希望充分的利用各个节点的左右指针,让各个节点可以指向自己的前后节点,要怎么办? 解决方案 --> 线索化二叉树 二、线索化二叉树 1、n个节点的二叉树链表总含有n+1(公式2n-(n-1)=n+1)个空指针域。...
数据结构——二叉树线索化
m0_74222411的博客
08-13 2032
根据某种遍历序列(前、中后序遍历),先确定下来每个节点的前驱和后继。对于每个节点来说,他的左右指针可能没有指向节点(值为NULL),这时候我们可以运用这些“空闲”的指针。比如:左指针如果有空闲,就用这个指针指向这个节点对应遍历序列的前驱,右指针如果有空闲,就用这个指针指向这个节点对应遍历序列的后继。(注意:遍历序列中一头一尾是没有前驱或者后继的,所以如果指针有空闲,我们还是当它指向的是孩子,而不是前驱或者后继)对于每个节点都实现了步骤2后,线索化完成。
java 二叉树详解 + 实现代码
12-21
二叉树概念: java二叉树的每个根节点最多有两颗字数,不存在子树大于2的节点,也就是说,二叉树是节点的最大度数为2的树,通常子树分为左子树和右子树,次序不能颠倒。 创建二叉树: public void createTree...
线索化二叉树C实现代码
02-24
包含两种线索化二叉树方法,具体如下: 1.利用结点中的空指针域,使其指向后继结点; 2.利用线性表保存二叉树的遍历顺序。
线索二叉树
04-10
通过前序序列创建线索二叉树 1:中序遍历 2:查找节点前驱后继 3:插入节点 4:删除节点 0:退出
C语言递归实现线索二叉树
12-31
本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点。 code: #pragma warning(disable:...
线索二叉树(存储结构,线索化,寻找前驱/后继)
jungleirim的博客
11-12 958
若左指针没有被线索化,先序遍历中,左右子树中的结点只可能是根的后继,不可能是前驱。若右指针没有被线索化:后序遍历中,左右子树中的结点只可能是根的前驱,不可能是后继。为了解决普通二叉树遍历,寻找前驱或者后继不方便的问题,引入了线索二叉树。,p的前驱为左兄弟子树中最后一个被先序遍历的结点。,p的后继为右兄弟子树中第一个被后序遍历的结点。后序线索二叉树――线索指向后序前驱、后序后继。先序线索二叉树――线索指向先序前驱、先序后继.②若结点p没有左孩子,则先序后继为右孩子。②若p没有右孩子,则后序前驱为左孩子。
详解线索二叉树
02-20 395
线索二叉树概念 1.定义   n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。   这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded   BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
数据结构】(十一)二叉树的创建,线索二叉树
qq_51523386的博客
05-20 413
数据结构】(十一)二叉树的创建(懒猫老师代码) (一)说明: 创建二叉树还是需要用到二叉树的遍历: 为什么要有返回值,是因为:返回值是数节点与节点相连的的桥梁,如果不返回则,建立的结点之间不相连,就构不成数了。 (二)第二种方法: ...
创建线索二叉树 csdn
01-05
创建线索二叉树是一种对二叉树进行优化的数据结构。它的目的是为了加快二叉树的遍历速度。在传统的二叉树中,为了实现对二叉树的遍历,需要使用递归或者栈来实现。而线索二叉树通过添加线索,将二叉树的节点之间的遍历顺序进行编码,从而实现快速遍历。 在线索二叉树中,每个节点都有两个指针:左指针和右指针。在一棵二叉树中,如果一个节点没有左孩子,则将其左指针指向该节点的前驱节点。如果一个节点没有右孩子,则将其右指针指向该节点的后继节点。通过这样的线索指针,可以快速地找到一个节点的前驱和后继节点,进而实现对二叉树的快速遍历。 具体来说,在线索二叉树中,如果一个节点没有左孩子,则将其左指针指向其前驱节点;如果一个节点没有右孩子,则将其右指针指向其后继节点。通过这样的线索化过程,原本需要递归或者栈来实现的遍历过程,可以直接通过线索指针快速找到下一个需要遍历的节点,从而提高了遍历的效率。 总的来说,线索二叉树是一种优化的二叉树结构,通过添加线索指针,将二叉树的节点之间的遍历顺序进行编码,从而实现了对二叉树的快速遍历。它的设计思想主要是通过设置节点的线索指针指向前驱和后继节点,提高了遍历效率,减少了递归或栈的使用。这是一个在实际应用中常用的数据结构,可以广泛应用于二叉树遍历的场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码) 79598
  • 线索二叉树(图解+完整代码) 23190
  • 赫夫曼编码树(图解+完整代码) 17102
  • 基于Q-learning的无人机三维路径规划(含完整C++代码) 13724
  • 平衡二叉树(详细解释+完整C语言) 13149

分类专栏

  • 计算机网络 1篇
  • 数据结构 17篇
  • C++ 6篇

最新评论

  • 图的概述与基本概念

    qq_35714706: 无向图和有向图的概念是不是写反了表情包

  • 二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)

    Dddqs: 这个是头文件包含的函数,在头文件中以已经实现了

  • 线索二叉树(图解+完整代码)

    Featherwit779: 比王道讲得好

  • 线索二叉树(图解+完整代码)

    Analysis_321: 请问中序线索化的时候pre指针为什么要设成全局变量?

  • 深入剖析双端队列(含完整C代码)与STL-deque(C++)

    CyAgyp123: deque在进行插入时,如果空间不足是进行扩容还是通过模运算跳到另一端

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 计算机网络(自顶向下方法)学习笔记(第一章)
  • 图的概述与基本概念
  • 平衡二叉树(详细解释+完整C语言)
2022年23篇

目录

目录

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~在下小吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司辽阳百度爱采购价格吉安百搜标王价格雅安至尊标王哪家好福州网站推广多少钱白银百度关键词包年推广多少钱池州外贸网站制作多少钱吉安百姓网标王推广报价大鹏推广网站价格汕头网站优化按天扣费哪家好崇左网站优化排名哪家好那曲如何制作网站推荐张家界网站定制多少钱武威企业网站设计推荐常德百度seo价格南充阿里店铺托管公司林芝营销型网站建设价格潜江网站优化按天计费价格天水网站改版价格南充关键词排名包年推广报价孝感设计公司网站唐山网站关键词优化价格深圳网站seo优化价格伊犁seo优化推荐防城港关键词按天计费南平网站推广工具报价南昌网站seo优化价格哈密外贸网站建设公司酒泉网站优化公司张家口关键词按天扣费多少钱永新建站推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化