线索化二叉树

线索化二叉树(线索化二叉树遍历方法,倒序线索化二叉树遍历结果) 本篇介绍线索化二叉树、线索化后的中序遍历以及反向输出中序遍历。 注:(不管是前序遍历、中序遍历或者后序遍历,道理都是一样的,只不过顺序不一样,所以本篇的就拿中序遍历作为讲解,方便统一与理解) 文章目录1.线索化二叉树1.1-什么是线索化二叉树1.2-线索化二叉树的意义1.3-线索化二叉树完整代码2.线索化后的中序遍历2.1-思路2.2-完整代码3.(拓展)利用线索化后的二叉树反向输出中序遍历3.1-思路3.2-完整代码 1.线索化二叉树 1.1-什么是线索化二叉树 首先思考一下:我们知道,不管是二叉树的前序 阅读详情

  二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,有两种方法。一是在结点结构中增加向前和向后的指针,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。

1.具体做法

图示:
在这里插入图片描述
代码:

typedef char  ElemType;
#define END  '#'
typedef enum{LINK = 0,THREAD = 1} PointerTag;
typedef struct BiThrNode
{
	BiThrNode *leftchild;
	BiThrNode *rightchild;
	PointerTag Ltag,Rtag;     //左右标记 
	ElemType data;
}BiThrNode,*BinaryThreadTree;

void MakeThread(BiThrNode *p,BiThrNode *&ptr)    //线索化 
{
	if(p != NULL)
	{
		MakeThread(p->leftchild,ptr);

		if(p->leftchild == NULL)
		{
			p->leftchild = ptr;
			p->Ltag = THREAD;
		}
		if(ptr != NULL && ptr->rightchild == NULL)
		{
			ptr->rightchild = p;
			ptr->Rtag = THREAD;
		}
		ptr = p;

		MakeThread(p->rightchild,ptr);
	}
}
void MakeThreadTree(BiThrNode *p)     //线索化二叉树 
{
	BiThrNode *ptr = NULL;
	MakeThread(p,ptr);
	ptr->Rtag = THREAD;    //线索化最后一个结点 ,注意形参的类型 
}

代码解释;
在这里插入图片描述

2.优势

(1)利用线索二叉树进行中序遍历时,不必采用堆栈处理,速度较一般二叉树的遍历速度快,且节约存储空间。
(2)任意一个结点都能直接找到它的前驱和后继结点
不足
(1)结点的插入和删除麻烦,且速度也较慢。
(2)线索子树不能共用。

3.注意事项
  1. 注意MakeThread函数的第二个参数,他是一个指针的引用。这样做的目的是为了让指针ptr在递归的过程中所发生的改变,能够影响到每一层栈帧。
  2. 要深刻理解递归调用代码运行轨迹,只有这样才能为用好递归提供先决条件
  3. 线索化的过程是对空指针的利用,千万不要改变原来指针的指向
  4. 看代码要深刻理解代码的思路,把我代码的运行轨迹,不要只看效果,那样只会增加莫名的感觉,没实际效果
  5. 看不懂,想不通,画图、画图、画图,重要的事情说三遍。
【c++】二叉树的线索化 什么是二叉树的线索化?或者问什么是线索二叉树? 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在改序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。这些指向直接前驱结点和指向直接后续结点的指针被称为线索(Thread),加了线索的二叉树称为线索二叉树。 以上是搜狗百科的一段文字,反正我是没看太懂。简单点 阅读详情

相关推荐

Vivado时序违约小结

目录1. setup time违约1.1 逻辑级数太高1.2 Fanout太大2. hold time 违约2.1 异步信号处理导致hold time违约 1. setup time违约 建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。 1.1 逻辑级数太高 Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能

mu_guang_的博客 7156

数据结构与算法之构建二叉搜索树

定义:遍历二叉树是以一定的跪着将二叉树中的结点排列成有一个线形序列,从而得到几种遍历序列,使得该序列中的每个结点(第一个和最后一个节点除外)都有一个直接前驱和直接后继。直接前驱和直接后驱使按照遍历序列的顺序来的(不是逻辑上的左右子树或父子关系)。规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继节点。

five-five 1117

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析

本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。

blockchain9miner的博客 1120

数据结构-线索二叉树

线索二叉树 1.什么是线索二叉树 遍历二叉树是按一定的规则将二叉树中所有结点排列为一个有序序列,这实质上是对一个非线性的数据结构进行线性化的操作。经过遍历的结点序列,除第一个结点和最后一个结点以外,其余每个结点都有且仅有一个直接前驱结点和一个直接后继结点。 当以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而不能直接得到结点任意一个序列中的直接前驱结点和直接后继结点是什么,这种信息只有在...

天使之翼 1932

Cadence仿真MOS电容C-V曲线:从电路图到参数扫描的完整流程

本文详细介绍了使用Cadence Virtuoso仿真MOS电容C-V曲线的完整流程,从电路图绘制到参数扫描,再到结果分析与问题排查。通过实际案例和实用技巧,帮助工程师快速掌握MOS电容特性分析的关键步骤,提升集成电路设计效率。

weixin_29271263的博客 431

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 480

Python实现线索化二叉树 Python实现线索化存储二叉树 Python线索化二叉树的遍历

Python实现线索化二叉树 Python实现线索化存储二叉树 Python线索化二叉树的遍历

storyfull 3288

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1481

中序线索化二叉树

为什么要线索化二叉树? 答:对于如下一颗二叉树,中序遍历二叉树结果为4,2,5,1,3那么我想知道5前面的数是什么,就必须要先中序遍历一遍然后再去查询5前面的数字。那么如果我这样操作:对于左右子节点为null的节点,它的左节点指向前一个节点,右节点指向下一个节点,同时标记指针置为1,这样的话,我就可以直接知道中序遍历时5的前一个节点和后一个节点。 这个对二叉树的操作过程叫:线索化二叉...

小飞的博客 7832

滴滴数据分析80道面试题及参考答案

常见的模型评价指标有准确率、召回率、F1 值、均方误差、均方根误差、R 方等。准确率是指模型预测正确的样本数占总样本数的比例,它反映了模型预测的准确性。召回率是指模型预测为正例的样本中实际为正例的比例,它衡量了模型对正例的捕捉能力。F1 值是准确率和召回率的调和平均数,综合考虑了两者的平衡。均方误差是预测值与真实值之差的平方的平均值,它衡量了模型预测值与真实值的平均偏离程度。均方根误差是均方误差的平方根,与均方误差类似,但更直观地反映了误差的大小。

大模型大数据攻城狮的专栏 1698

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 64

线索化二叉树(先序,中序,后序)+线索化二叉树的遍历【java详解】

n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种一个结点的前一个结点,称为前驱结点一个结点的后一个结点,称为后继结点//线索化时记录前一个节点//节点存储结构。

2302_79862386的博客 3233

一文搞懂 JavaScript 模块化规范:CommonJS、AMD、ES6 Module

在现代 JavaScript 开发中,模块化是提升代码组织性和可维护性的关键。本文深入解析三种主流的模块化规范——CommonJS、AMD 和 ES6 Module。

Allen- 3479

【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】

1.何谓线索化二叉树2.线索化二叉树的本质3.线索化二叉树的存储结构4.构建线索化二叉树4.1.先序线索化4.2.中序线索化4.3.后序线索化5.遍历线索化二叉树5.1.先序遍历 先序线索化二叉树5.2.中序遍历 中序线索化二叉树5.3.后序遍历 后序线索化二叉树6.线索化二叉树的优势与劣势 1.何谓线索化二叉树 ????‍☠️一般的二叉树的叶子节点的指针都造成了浪费,对于有n个节点的二叉树,其中就有n+1个空链域;所以我们可以将空链域存放某种遍历次序下该节点的前驱节点和后继节点,这些指针被成为线索,

Kevinnsm的博客 7088

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

线索化二叉树(前序线索化,中序线索化)

为什么要对二叉树进行线索化? 对二叉树进行遍历是以一定的规则将二叉树的节点排列成一个线性序列,这些线性序列有且仅有一个直接前驱和直接后继,但是以二叉链表进行存储的时候,只能找到节点的左右孩子信息,不能直接得到节点在任一序列的前驱和后继信息,前驱和后继信息只能在遍历的动态过程中才能得到。 如何获取到前驱和后继的信息呢? 在有n个节点的二叉链表中必定存在n+1个空链域,利用这些空链域存放节点的前

静陌慕春 3万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

线索化二叉树以及遍历线索化二叉树

线索化二叉树以及遍历线索化二叉树 1.线索二叉树基本介绍 n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 一个结点的前一个结点,称为前驱结点 一个结点的后一个结点,称为

xiaoshiguang3的博客 480

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

中序线索化二叉树及遍历

中序线索化二叉树及遍历。 函数接口定义: void InThreading(BiThrTree p);// 以结点P为根的子树中序线索化 void InOrderTraverse_Thr(BiThrTree T);// 中序遍历二叉线索树T的非递归算法,对每个数据元素直接输出 裁判测试程序样例: #include<iostream> using namespace std; type...

zaiyang遇见 9089

二叉树的线索化

测试环境:VS2010  一、线索二叉树的引入         二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。               为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。

snow_5288的博客 3215

前序线索化二叉树

前序化二叉树的方法 其实这里的重点就是设置一个变量来记录当前节点的上一个节点,然后再进行处理,重中之重就是画图!!! 还有就是要明白递归是什么,递归式回溯!!! 在上一篇文章中已经讲过线索化二叉树和中序线索化二叉树的方法 现在在这里再讲一下前序线索化二叉树以及遍历前序线索化二叉树的方法 /** * 前序线索化二叉树 * @param node */ void preThreadOrder(HeroNode node) { if(node == null)

来杯咖啡吗的博客 1377

线索化二叉树及线索化后的遍历

对于我来说,这个线索化也是困扰了我很久,一直不明白它的逻辑,甚至看视频课也听不懂,直到今天我才恍然大悟我之前一致忽略了一个很重要的点:线索化是针对完全二叉树而言的,所以我们应该了解完全二叉树的特点,对于这个线索化的遍历,我觉得要理解一个很重要的点:那就是完全二叉树的节点一定是左边连续的,也就是说当一个节点没有左孩子了,那么它一定没有右孩子,我之前就是没有考虑到这一点才想不通。

qq_51546137的博客 700

二叉树线索化以及线索化前序、中序、后序遍历

二叉树线索化以及线索化前序、中序、后序遍历 前面已经对二叉树的创建与建立有了一定了解,那二叉树的线索化又是什么呢? 二叉树虽然是非线性结构,但二叉树的遍历却为二叉树的节点导出了一个线性序列。 用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节

honeyJ 1708
上一篇: 重建二叉树
下一篇: Linux基础知识
sqrt_2
博客等级 码龄9年 15粉丝 65原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值