学习笔记-数据结构-树与二叉树(2024-04-23)

线索二叉树
传统的二叉链表存储仅能体现一种父子关系,不能直接得到节点在遍历中的前驱或后继。在含有n个节点的二叉树中,有n+1个空指针。这是因为每个叶节点都有2个空指针,每个度为1的节点都有1个空指针,空指针总数为2n0+n1,又因为n0=n2+1,所以空指针的总数为n0+n1+n2+1=n+1。由此设想利用这些空指针来指向其前驱或后继。
引入线索二叉树正是为了加快查找节点前驱和后继的速度。
规定:若无左子树,令lchild指向其前驱节点;若无右子树,令rchhild指向其后继节点,还需要增加两个标志域,以标识指针域指向左(右)孩子或前驱(后继)。

typedef struct ThreadNode
{
	ElemType data;//数据元素
	struct ThreadNode *lchild,*rchild;//左、右孩子指针
	int ltag,rtag;//左、右线索标志
}ThreadNode,*TreadTree;

二叉树的线索化是将二叉链表中的空指针改为指向前驱或后继的线索。而前驱或后继的信息只有在遍历时才能得到,因此线索化的实质就是遍历一次二叉树。

以中序线索二叉树的建立为例。附设指针pre指向刚刚访问过的节点,指针p指向正在访问的节点,即pre指向p的前驱。在中序遍历的过程中,检查p的左指针是否为空,若为空就将它指向pre;检查pre的右指针是否为空,若为空就将它指向p。
通过中序遍历对二叉树线索化的递归算法如下:

void InThread(ThreadTree &p,ThreadTree &pre)
{
	if(p!=NULL)
	{
		InThread(p->lchild,pre);//递归,线索化左子树
		if(p->lchild==NULL)//当前节点的左子树为空
		{
			p->lchild=pre;//建立当前节点的前驱线索
			p->ltag=1;
		}
		if(pre!=NULL && pre->rchild==NULL)//前驱节点非空且其右子树为空
		{
			pre->rchild=p;//建立前驱节点的后继线索
			pre->rtag=1;
		}
		pre=p;//标记当前节点成为刚刚访问过的节点
		InThread(p->rchild,pre);//递归,线索化右子树
	}
}

通过中序遍历建立中序线索二叉树的主过程算法如下:

void CreateInThread(ThreadTree T)
{
	ThreadTree pre=NULL;
	if(T!=NULL)//非空二叉树,线索化
	{
		InThread(T,pre);//线索化二叉树
		pre->rchild=NULL;//处理遍历的最后一个节点
		pre->rtag=1;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570512.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java探索之旅】解密构造方法 对象初始化的关键一步

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、对象的构造及初始化1.1 构造方法1.2 构造方法的特性1.3 默认初始化1.4 就地初始化…

新手可以能做视频号小店,其实,视频号远没你想象中难!

大家好,我是电商花花。 最近注意到一个又一个新手小白提供视频号小店成功逆袭,实现了自己的创业梦想。 最近电商行业在飞速发展,越来越多的人开始关注视频号小店这个新兴的市场和平台。 有的新手拼命的往里扎,但是不少新手商家…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记: 事务的基本概念 事务 定义 用户定义的一个数据库操作系列,这些操作要么全做,要么全不做,是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交,提交事务的所有操作 ROLLBACK 回滚&#xff0c…

UE5 GAS开发P35,36,37,38,39 将药水修改为AbilitySystem效果

这几节课都是将药水修改成更方便使用的AbilitySystem效果的Actor,分别为增加血量,增加蓝量,暂时获得最大生命值上限 AuraEffectActor.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #…

浅析Java的字符串的底层和相关知识(恳请大佬指正)

本期经验和建议的总结: 在拼接字符串的时候,如果大量拼接时建议使用StringBuilder,在转为字符串。 1:Java的号比较的原理: 在Java中,号在对基本数据类型进行比较时,比较的时具体的数值大小例…

【网络安全】跨站脚本攻击(XSS)

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 一、XSS简介 二、XSS漏洞危害 三、XSS漏洞类型 1.反射型XSS 2.存储型XSS 3.DOM型XSS 四、XSS漏洞防御 一、XSS简介 XSS(Cross-Site Scripting) XSS 被…

【认真白嫖】注册免费域名

一、eu.org官网 https://nic.eu.org/,始于1996年,对个人和组织是免费注册,页面还真有96年的风格,点进去注册就行。 二、注册 使用随机生成一个虚拟英国或者美国地址的网站,会提高通过的概率。 https://www.haoweic…

朴素贝叶斯算法分类

def loadDataSet():postingList[[my, dog, has, flea, problems, help, please], #切分的词条[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, posting, stupid, worthless, garbage],[mr, licks, ate, my, steak, …

微信小程序开发六(自定义组件)

自定义组件的创建: 如何创建: 右键选择新建component 创建完成之后需要打开app.json,这是全局使用这个组件,想要单独的页面使用,就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

为什么光电测径仪质量更稳定可靠?

光电测径仪与激光扫描式测径仪都是目前常用的外径自动化测量设备,他们能实现的功能相同,但为什么说光电测径仪更稳定可靠,下面一起来看一下。 光电测径仪测量原理 测头部件是测径仪的核心部件,它的作用是将被测物在CCD芯片上清晰…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段:创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说,发布版本的创建都需要一定的时间,其具体过程因各公司或组…

HarmonyOS开发案例:【闹钟】

介绍 使用后台代理提醒,实现一个简易闹钟。要求完成以下功能: 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表,并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 相关概念 [Canva…

翻译《The Old New Thing》 - Why are HANDLE return values so inconsistent?

Why are HANDLE return values so inconsistent? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040302-00/?p40443 Raymond Chen 2004年01月27日 简介 在处理 Windows 编程中的句柄时,开发者需要面对的一个挑战是不同函数可…

时间步长问题。tensorflow训练lstm时序模型,输出层实际输出维度和期待维度不一致

设置输出维度为1. Dense(1) 但结果跑出来的输出维度每次都是三维的。 模型设置: 输入x维度(2250,48,2) 输入y 维度(2250,) 和 (2250,1) 但模型预测…

盲人咖啡厅导航:科技之光点亮独立生活新里程

在这个繁华的世界中,咖啡厅不仅是人们社交聚会、休闲阅读的场所,更是无数人心灵栖息的一方天地。然而,对于视障群体而言,独自前往这样的公共场所往往面临重重挑战。幸运的是,一款名为蝙蝠避障专为盲人设计的辅助应用&a…

Day 5 广告管理

Day 5 广告管理 这里会总结构建项目过程中遇到的问题,主要流程,以及一些个人思考!! 学习方法: 1 github源码 文档 官网 2 内容复现 ,实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 创建…

光速记单词-brother开头的单词

1. 思维导图 1.1 brother 1.2 mom 1.3 dad 1.4 man 2. 视频链接

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming,也就是面向切面编程,是一种思想。它是针对OOP(面向对象编程)的一种补充,是对某一类事情的集中处理。比如一个博客网站的登陆验证功能,在用户进行新增、编辑、删除博…

js手写call、bind、apply

目录 call与applyapply bind call和apply和bind有两种实现方式,第一种是隐式绑定,第二种是通过new 无论是通过隐式绑定实现还是通过new实现,核心都是针对this的绑定规则 具体关于this的绑定规则可以看我这一篇博客 this绑定规则 call与apply…

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…
最新文章