数据结构--线索二叉树找前驱后继

数据结构–线索二叉树找前驱后继

中序线索二叉树找中序后继

在中序线索二叉树中找到指定结点*p的 中序后继 \color{red}中序后继 中序后继next
①若p->rtag == 1,则next = p->rchild
②若p->rtag== 0

中序遍历――左根右
左根(左根右)
左根((左根右)根右)
next = p的右子树中最左下结点

typedef struct ThreadNode
{ElemType data;struct ThreadNode *lchild, *rchild;int ltag, rtag; //左、右线索标志
}ThreadNode, *ThreadTree; //找到以P为根的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p)
{//循环找到最左下结点(不一定是叶结点)while (p->ltag == 0)   p = p->lchild;return p;
}
//在中序线索二叉树中找到结点p的后继结点
ThreadNode *Nextnode(ThreadNode *p)
{//右子树中最左下结点if (p->rtag == 0)   return Firstnode(p->rchild);else    return p->rchild;
}
//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)
void Inorder(ThreadNode *T)
{for (ThreadNode *p = Firstnode(T); p != NULL; p = Nextnode(p))visit(p);
}

中序线索二叉树找中序前驱

//找到以P为根的子树中,最后一个被中序遍历的结点
ThreadNode *Lastnode(ThreadNode *p)
{while (p->rtag == 0) p = p->rchild;return p;
}
//在中序线索二叉树中找到结点p的前驱结点
ThreadNode *Prenode(ThreadNode *p)
{//左子树中最右下结点if (p->ltag == 0)   return Lastnode(p->lchild);else    return p->lchild;
}
//对中序线索二叉树进行逆向中序遍历
void RevInorder(ThreadNode *T)
{for (ThreadNode *p = Lastnode(T); p != NULL; p = Prenode(p))visit(p);
}

在中序线索二叉树中找到指定结点*p的 中序前驱 \color{red}中序前驱 中序前驱pre
①若p->ltag == 1,则pre = p->lchild
②若p->ltag == 0

中序遍历―—左根右
(左根右)根右
(左根(左根右))根右
pre =p的左子树中最右下结点

先序线索二叉树找先序后继

先序遍历序列:A B D G E C F

在先序线索二叉树中找到指定结点*p的先序后继next
①若p->rtag == 1,则next = p->rchild
②若p->rtag == 0

先序线索二叉树找先序前驱

在先序线索二叉树中找到指定结点*p的先序前驱pre
①若p->ltag == 1,则next = p->lchild
②若p->ltag == 0

除非用土办法从头开始先序遍历
先序遍历中,左右子树中的结点只可能是根的后继,不可能是前驱

改用三叉链表可以找到父节点 \color{green}改用三叉链表可以找到父节点 改用三叉链表可以找到父节点

后序线索二叉树找后序前驱

后序遍历序列:G D E B F C A

在后序线索二叉树中找到指定结点*p的后序前驱pre
①若p->ltag == 1,则 pre = p->lchild
②若p->ltag == 0

后序线索二叉树找后序后继

在后序线索二叉树中找到指定结点*p的后序后继next
①若p->rtag == 1,则next = p->rchild
②若p->rtag == 0

除非用土办法从头开始先序遍历

后序遍历中,左右子树中的结点只可能是根的前驱,不可能是后继

改用三叉链表可以找到父节点 \color{green}改用三叉链表可以找到父节点 改用三叉链表可以找到父节点

知识点回顾与重要考点

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于matlab使用多类掩码区域的卷积神经网络对人和汽车的各个实例进行分段(附源码)

一、前言 此示例展示了如何使用基于多类掩码区域的卷积神经网络 (R-CNN) 对人和汽车的各个实例进行分段。实例分割是一种计算机视觉技术,您可以在其中检测和定位对象,同时为每个检测到的实例生成分割图。 此示例首先演示如何使用…

分治法求最近点对问题

目录 蛮力法 分治法 探究分治规模小于一定程度时采用暴力解法 蛮力法 算法思想 蛮力法,顾名思义,即穷举所有点与点之间的距离,两层循环暴力找出最近点对。算法执行可视化如图1所示,word文档GIF静态显示,附件已含动…

阿里版ChatGPT——通义千问,开箱初体验

所有行业、所有应用、所有服务都值得基于新型人工智能技术重做一遍,在带来创造性客户体验的同时,生产范式、工作范式、生活范式也将发生变化。——阿里集团董事会主席兼CEO 张勇 2023阿里云峰会上,通义千问大语言模型对外发布,宣称…

JAVA环境变量配置步骤及测试(JDK的下载 安装 环境配置教程)

目录 一:JDK的下载、安装和配置 JDK 压缩包版的安装 JDK 安装版的安装 二:环境变量配置步骤 三:测试 四、Eclipse安装 已对此文进行更新,请到新文发布地址:https://rej177.blog.csdn.net/article/details/131565…

SpringBoot通过获取请求参数或者Headers上的特殊标识实现i18n国际化

实现效果 我们大部分都是把i18n的标识放在Headers上面;而把标识放在参数上的话比较少,放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上 配置在Headers上面: 配置在params上面: 配置代码: /**…

ChatGPT Prompting开发实战(一)

第7章 ChatGPT Prompting开发实战 7.1 Prompting在LangChain框架中的应用 本节跟大家讲提示工程(Prompt Engineering),主要基于工业级的源码以及具体的项目,无论是工程人员,还是不具有技术背景的人员,大家多少都听说过提示词,或者频繁使用过,简单而言,当我们使用OpenA…

CleanMyMac X4.13中文版mac电脑优化加速工具

CleanMyMac X 可以卸掉系统的额外负担 让您的电脑明显提速 不要再因为运行缓慢的 Mac 而拖慢您的效率。CleanMyMac X已经正式发布,作为最新的系统清理和应用管理软件,可以让用户一键智能化清理Mac电脑,自动扫描Mac上的所有文件,包…

谈谈mysql——主从模式下的同步方式及半同步、MGR的部署方式

MySQL的复制模式 异步复制 MySQL的复制方式默认是异步的,主从复制涉及三个线程 master I/O master I/O线程负责写入Binlog,并将执行结果返给客户端,至于Binlog有没有被IO线程读取,读取后有没有重放,重放有没有成功&…

数据库之表的创建及数据类型

目录 创建表 简单语法: 固定格式: 案例 数据类型 文本类型 文本型 字符串型 二进制文本 枚举型 集合型 数字类型 整数型 浮点型 Date类型 DATE()日期 DATETIME() 日期和时间的组合 TIMESTAMP() 时间戳 TIME() 时间 YEAR() 2 位或 4 位…

低代码平台的价格范围及购买成本分析

Zoho Creator是一款强大而灵活的低代码应用程序开发平台,可帮助企业快速、高效地创建各种应用程序。但是,很多人可能会担心它的价格问题。在这篇文章中,我们将深入探讨Zoho Creator的定价策略和计划,以帮助您更好地理解其价格结构…

Android Studio 和 Android Gradle 插件的已知问题

Android Studio 的已知问题 渲染 Compose 预览时出错 从 Android Studio Chipmunk 开始,如果您在问题面板中看到 java.lang.NoSuchFieldError: view_tree_saved_state_registry_owner 或 java.lang.ClassNotFoundException: androidx.savedstate.R$id,…

SIP 协议的主要流程

目录 SIP 协议的呼叫模型图 基本呼叫建立流程 基本呼叫拆除流程 经过代理的呼叫建立流程 经过代理的呼叫拆除流程 SIP 协议在软交换 SoftX3000(华为推出的一个支持sip协议的交换机设备) 流程图 SIP 协议的呼叫模型图 MGC 负责将 PSTN 前向信令映射…