线索二叉树

线索二叉树(线索链表遍历,二叉树线索化) 特别的是,对于D和F,D是中序遍历的开头结点,它没有前驱节点;F是中序遍历的结尾的结点,它没有后继节点,那么这时,寻找的规则是,如果结点的Ltag==1代表可以直接找到前驱节点;由下图可见,有的左右指针是连接的子树,没有链接左右子树的指针现在就通过红色的虚线指向了该结点的前驱或者后继。可以发现,相较于原来的二叉链表,这里在数据结构里添加了两个int类型,来规定左右指针的作用。再通过以下步骤创建一个线索二叉树(下图是中序线索二叉树的结构示意)线索二叉树,即在二叉链表的基础上,将二叉链表的。... 阅读详情

1.基本概念

对于某些二叉树而言,其指针域的空间不能被充分利用。因此我们可以考虑利用那些空的指针域来存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,对应的二叉树就称为线索二叉树。
我们对二叉树以某种次序遍历使其变为线索二叉树的过程称作是线索化。线索化的过程就是在遍历二叉树时修改结点空指针的过程。
2.线索二叉树的存储结构

为区别某一节点的lchild指针是指向它的左孩子还是指向前驱,rchild指针是指向它的右孩子还是后继?我们可以分别设置一个ltag标志和一个rtag标志。当标志变量值为0时,表明此时对应的指针指向结点的孩子,而当标志变量值为1时,表明此时对应的指针指向某次遍历的前驱或后继。

 //线索二叉树的存储结构定义  
typedef int TElemType;         //元素的数据类型根据实际情况而定,这里假设为int

typedef struct Node          //结点结构 
{  
    TElemType      data;      //数据域,用于存储结点数据   
    struct Node  *lchild;     //指针,指向该结点的左孩子或前驱 
	struct Node  *rchild;     //指针,指向该结点的右孩子或后继 
	int        ltag,rtag;     //标志,指示指针指向左右孩子还是前驱后继 
}BiThrNode,*BiThrTree;

3.线索二叉树的建立

在此以中序遍历和先序遍历为例建立线索二叉树

BiThrTree pre=NULL;                //全局变量,始终指向访问的前一个结点
//中序线索化 
void InThreading(BiThrTree p)
{
	if (p)
	{
		InThreading(p->lchild);
		if (!p->lchild)      //如果当前结点的左孩子不存在,则修改当前结点的左标志,并使其左指针指向前一个结点 
		{
			p->ltag=1;
			p->lchild=pre;
		}
		if ((pre!=NULL) && (!pre->rchild))     //如果前一个结点的右孩子不存在,则修改前一个结点的右标志,并使其右指针指向当前结点 
		{
			pre->rtag=1;
			pre->rchild=p;
		}
		pre=p;               //将当前结点定义为前一个结点,为下一轮作准备 
		InThreading(p->rchild);
	}
} 
BiThrTree pre=NULL;                //全局变量,始终指向访问的前一个结点
//先序线索化 
void PreThreading(BiThrTree p)
{
	if (p)
	{
		if(!p->lchild)
		{
			p->ltag=1;
			p->lchild=pre;
		}
		if ((pre!=NULL) && (!pre->rchild))
		{
			pre->rtag=1;
			pre->rchild=p;
		}
		pre=p;
		if (p->ltag!=1)
		PreThreading(p->lchild);
		if (p->rtag!=1)
		PreThreading(p->rchild);
	}
}

4.线索二叉树的遍历

中序遍历:

void InOrderTraverse(BiThrTree T)
{
	BiThrTree p;
	p=T;
	while(p)                //树空或已经到最后一个结点时停止循环 
	{
		while(p->ltag!=1)  //遍历左子树,直到一个没有左孩子的结点 
		{
			p=p->lchild;
		}
		printf("%d",p->data); //打印该结点 
		while(p->rtag==1)  //如果当前结点有后继,则直接访问后继结点 
		{
			p=p->rchild;
			printf("%d",p->data);
		}
		p=p->rchild;     //如果当前结点没有后继时,进入其右子树 
	}
}

先序遍历:

void PreOrderTraverse(BiThrTree T)
{
	BiThrTree p;
	p=T;
	while (p)       //树空或已经到最后一个结点时停止循环 
	{
		printf("%d",p->data);   //打印结点 
		if (p->ltag!=1)   //当前结点的左孩子存在时,下一个结点为左孩子 
		{
			p=p->lchild;
		}else            //若左孩子不存在,则下一个结点为当前结点的右孩子 
		{                //若右孩子也不存在,则下一个结点为当前结点的后继 
			p=p->rchild;
		}
	}
} 

5.代码验证

int main()
{
	BiThrTree T;
	printf("按先序遍历建立线索二叉树:\n");
	CreateBiTree(&T);   //创建树T 
	PreThreading(T);    //先序线索化T 
	printf("\n线索二叉树的先序遍历:\n");
	PreOrderTraverse(T);  //遍历T 
	return 0;
}

这里写图片描述

int main()
{
	BiThrTree T;
	printf("\n按先序遍历建立线索二叉树:\n");
	CreateBiTree(&T);    //创建树T 
	InThreading(T);      //中序线索化T 
	printf("\n线索二叉树的中序遍历:\n");
	InOrderTraverse(T); //遍历T 
	return 0;
}

这里写图片描述


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。 文章目录一、c语言实现先序线索、中序线索、后续线索二叉树总结 一、c语言实现先序线索、中序线索、后续线索二叉树 代码如下(示例): #include <stdio.h> #include <stdlib.h> typedef struct BiTNode { int data; BiTNode* lchild, * r. 阅读详情

相关推荐

【数据结构】-树-先序线索二叉树,中序线索二叉树,后序线索二叉树

先序线索二叉树,中序线索二叉树,后序线索二叉树之间的对比 结论: 1.先序线索二叉树找前驱节点困难,找后继节点简单 后序线索二叉树找后继节点困难,找前驱节点简单 中序线索二叉树找前驱节点,后继节点都很简单 2.遍历中序和先序线索二叉树,不需要栈,直接通过线索就可以实现 遍历后序线索二叉树,要用栈 注: 1.三种线索二叉树的叶子节点数都能通过线索直接找到前驱和后继,因此分析能否直接遍历,只需要看前非叶子节点是否能找到自己的前驱和后继就好了。 2.三种遍历前驱和后继的位置 ...

vector的博客 6136

线索化二叉树的作用

一、先看一个问题 将数列{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)个空指针域。...

学Java,找哪吒 1万+

线索二叉树的建立、删除、插入、恢复线索

线索二叉树的建立 删除 插入 恢复线索

【数据结构】线索二叉树(适用场景+图文推导过程+C语言代码实现)

在实际问题中,如果所用的二叉树需经常遍历或查找结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉链表的存储结构就是非常不错的选择。我们对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化。

crr411422的博客 5996

二叉树的线索化(中序线索二叉树)

NULL 博文链接:https://128kj.iteye.com/blog/1634367

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

线索二叉树的存储结构及其作用(C语言)

一、 线索二叉树 (一)线索二叉树的作用 能否从一个指定结点开始中序遍历? 思路: 从根节点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针 pre 记录上一个被访问的结点 ①当q == p时,pre为前驱 ②当pre == p时,q为后继 缺点:找前驱、后继很不方便;遍历操作必须从根节点开始。 //中序遍历 void InOrder(BiTree T){ if(T != NULL){ InOrder(T -> lchild); //递归遍历左子树 visit(T); /

派拉斯兔子的博客 1707

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6392

树(四)——线索二叉树

树(四)——线索二叉树(c语言)

在校生 7542

从SPI协议到文件系统:手把手教你用HAL库给W25Q16移植FATFS(附扇区管理优化方案)

本文详细介绍了如何在STM32平台上,通过HAL库的SPI接口为W25Q16 Flash芯片移植FATFS文件系统。文章从SPI通信基础讲起,深入解析了FATFS底层驱动(diskio.c)的移植要点,并重点探讨了针对W25Q16的4KB物理扇区特性进行扇区管理优化的两种方案,旨在帮助开发者构建稳定高效的文件存储方案。

happy2的博客 1043

树莓派国内镜像源一键配置指南

本文提供树莓派国内镜像源一键配置指南,解决默认国外源访问缓慢问题。通过自动检测系统版本并支持清华、阿里云、中科大等主流镜像站选择,大幅提升软件更新与安装速度。包含详细的手动配置方法和常见问题排查,帮助用户快速完成树莓派换源优化。

tequila的博客 1376

详解线索二叉树

对线索二叉树的概念进行说明,并分别介绍了中序线索二叉树、先序线索二叉树和后序线索二叉树找其前驱和后继的方法。

kusunoki的博客 9929

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 195

关于线索二叉树的详解

线索二叉树的详解 目录线索二叉树的详解前言一、线索二叉树是什么?三种二叉树线索化实例图二、实现线索二叉树1.二叉树的线索化2.线索二叉树的遍历中序线索二叉树寻找遍历的首节点中序线索二叉树寻找节点的直接后继遍历中序线索二叉树总结 前言 学了二叉树,我们发现,对二叉树的遍历是一个比较复杂的问题,需要用到递归或者栈才可以进行遍历,这样子的遍历实质上就是将二叉树化为一个有序的线性序列,在这个序列中,每一个节点有且只有一个前继节点(第一个节点除外),和一个后继节点(最后一个节点除外),但是这些节点不能直接的找到当

kcy的博客 1万+

手把手教你离线部署Jupyter Notebook及高效插件配置

本文详细介绍了如何在离线环境中部署Jupyter Notebook及配置高效插件,包括离线安装步骤、依赖管理、核心扩展安装及常见问题排查。特别针对金融、科研等封闭网络场景,提供完整的whls包和requirements.txt解决方案,帮助开发者和数据分析师突破网络限制,提升工作效率。

weixin_28839549的博客 583

笔试题-2023-思特威-数字电路设计(CIS)【纯净题目版】

10 笔试题-2023-思特威-数字电路设计(CIS)【纯净题目版】

w0shishabi的博客 1472

线索二叉树、中序线索二叉树的创建和遍历

线索二叉树 按照某种遍历次序对二叉树进行遍历,可以把二叉树中的所有结点排成一个线性序列。在具体应用中,有时需要访问二叉树中的结点在某种遍历序列中的前驱和后继,此时,在存储结构中应保存结点在某种遍历序列中的前驱和后继。这些指向前驱和后继结点的指针称为线索,加上线索的二叉树称为线索二叉树,相应地,加上线索的二叉链表叫做线索链表。线索链表结构如下: 字段:ltag, lchild, value, rchild, rtag ltag={0,lchild指向该结点的左孩子1,lchild指向该节点的前驱rtag={0

HMT的博客 6328

【Java基础】还看不懂JDK7 HashMap环的产生原理你来打我

JDK7对旧table数据重定位到新table的函数transfer如下,其中重点关注部分以标出。 头插法正常情况下: 并发情况下 线程1只执行了Entry<K,V> next = e.next就被挂起了,而线程2正常执行完毕,结果图如下: 线程1接着下面继续执行: 通过逐步分析跟绘图可以知道红色部分会有环产生。 ...

sowhat 4244

树 —— 线索二叉树

线索二叉树的定义 充分利用二叉链表中的空链域,将遍历过程中结点的前驱、后继信息保存下来。 若结点有左子树,则其 LChild 域指向其 左孩子,否则 LChild 域指向其 前驱结点。 若结点有右子树,则其 RChild 域指向其 右孩子,否则 RChild 域指向其 后继结点。 线索:在这种存储结构中,指向前驱和后继结点的指针叫做线索。 线索链表:以这种结构组成的二叉链表作为二...

starter_____的博客 2425

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

线索二叉树的理解

为什么要有线索二叉树? 为了解决无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题 但是同时出现了二叉链表找左、右孩子困难的问题,即在构建线索二叉树之后,链表的原来遍历方式会出问题。 --ltag为0表示lchild指向该节点的左孩子,为1表示lchild指向该节点的前驱 --rtag为0,表示rchild指向该节点的右孩子,为1时,rchild指向该节点的后继 #inc...

huangwei18351的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二叉树的线索化

线索二叉树(Threaded BinaryTree) 1.线索二叉树的基本概念       遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后序序列。 这实质上是对一个非线性结构进行线性化操作。使每个结点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继。      例如二叉树结点的中序序列a+b*c-d-e/f中,“c”

编程小霸王的Blog 3万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

后序线索二叉树画法_线索二叉树

产生的背景:存在空间浪费的二叉树如上图的二叉树中,如果没有左孩子或者没有右孩子时,就存在空间浪费,如果二叉树很大时,空间浪费就会非常严重。如果想知道某个结点的前驱和后继时,就要通过遍历一次来确定。所以为了解决这个问题,现在可以利用这些浪费的空间来存储结点的前驱和后继。按照一种的顺序来存储前驱和后继。(例如中序遍历的方式)利用浪费的空间来做有限的线索化目的: 解决空间浪费问题;寻找某个结点的前驱和后...

weixin_39789690的博客 1万+
上一篇: 二叉树及其遍历(递归和非递归实现)
下一篇: 树、森林与二叉树的转换及遍历
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值