# 二叉树和线索二叉树相关问题v1

news/2024/5/18 12:23:12/文章来源:https://blog.csdn.net/xuchaoxin1375/article/details/127072871

文章目录

  • 二叉树和线索二叉树相关问题v1
  • 遍历算法
    • 遍历顺序分类
      • 遍历要点
      • 核心
    • 递归方式
    • 非递归方式
    • 线索二叉树
      • 二叉树vs线索二叉树(逻辑结构OR存储结构)
      • 线索二叉树的空指针剩余问题
      • 线索二叉树的遍历

二叉树和线索二叉树相关问题v1

遍历算法

image-20220926151355527

image-20220926151450178

  • pre (NLR)=A{B(DHI)(EJK)}{C(FLM)(GNO)}:∠\angle
    • image-20220926155205000
  • in (LNR)={(HDI)B(JEK)}A{(LFM)C(NGO)}:∧\wedge
    • image-20220926155419110
  • post(LRN)={(HID)(JKE)B}{(LMF)(NOG)C}A:⦣
    • image-20220926155222415

遍历顺序分类

  • 设根节点为N,左子树为L;右子树为R

    • 下面的三种有序遍历都是将高树降阶(矮化)展开
      • 高树=两棵矮树+一个根结点
      • 不断的对矮树进行矮化,直到矮树只有2层甚至1层
  • 先根遍历(先序遍历):preOrder

    • NLR
  • 中根遍历(中序遍历):InOrder

    • LNR
  • 后根遍历(后序遍历):postOrder

    • LRN

遍历要点

  • 根据树的定义(二叉树也是树)是递归这一特点,遍历树的所有结点的过程用递归将会很合适,很容易描述
  • 我们可以把二叉树的所有结点当做不同级别子树(根节点)
    • 对于叶子结点,其左右孩子都为NULL
    • 左子树永远比(同级别)的右子树先被遍历到
    • 根结点左子树的递归中,较矮的子树先完成遍历,然后是同样矮的右子树完成遍历
      • 最后才是高一层的子树完成遍历
      • 对于中序遍历和后续遍历是自下而上,自左往右的遍历结点
      • 第一个输出(visit)的结点是全树的最左下角结点
      • 当最浅层调用(最近一次调用)完成(弹出调用栈);
      • 次浅层以及更深层调用也逐渐先后地完成,弹出调用栈
    • 调用栈是进进出出的
      • 第一次出栈调用前全部都是进栈
    • 对应于手工计算中序遍历
      • 如果某子树的左子树缺失,那么我们显式的将缺失的左子树用NULL来表示
      • 访问
void xOrderTraverse(BinaryTree T){//参数是二叉树的根节点(作为代表,表示被遍历的二叉树)if(T){/*下面place1/2/3除是三种防止visit(T)的位置,分别对应先序遍历,中序遍历,后序遍历*///place1xOrderTraverse(T->lchild);//递归遍历左子树(递归调用的参数为左子树的根结点)//place2xOrderTraverse(T->rchild);//递归遍历右子树(递归调用的参数为右子树的根结点)//place3}/*递归出口如果本次传入的参数T是个NULL,那么直接结束本次递归调用内部的两个递归调用是通过(子)的树根节点联系起来*/
}
  • 对于叶子结点:
xOrderTraverse(Leaf);//
//内部
if(leaf){//visit位于palce1/2/3xOrderTraverse(NULL);xOrderTraverse(NULL);
}
  • 另外,对于度为1的结点,它的调用执行过程形如:

    • 下面两种情况都会触发一次空调用

      • T->child表示非空的子树(的根结点)
    • {    xOrderTraverse(NULL);xOrderTraverse(T->child);}
      \\或者
      {    xOrderTraverse(T->child);xOrderTraverse(NULL);}
      
  • 最浅层调用:

    • 叶子结点的调用中,包含了来两个xOrderTraverse(NULL)调用
    • 它们是几乎是瞬间就完成的:
    • 计算量非常少,即if(NULL)就结束了

核心

  • 本质上是对两层矮树的遍历
  • 任何一棵高层树,都会化为对2层矮树的遍历
    • 如果将已经遍历的矮树视为一个大结点
  • 每遍历完一棵二层矮子树,就将其视为一个大结点,并且继续遍历这个矮树大结点的双亲(LNR)或者其右兄弟树(LRN)(如果有)

递归方式

  • 三种方式的递归遍历算法都比较相似
    • 差别仅在于一行访问逻辑(visit()的位置)
      • 如果抹去这一行,那么三种顺序的遍历函数就是一样的
    • 当然还有函数名字

非递归方式

线索二叉树

二叉树vs线索二叉树(逻辑结构OR存储结构)

  • 二叉树是一种逻辑结构(非线性结构)

    • 可以用顺序存储
    • 可以用链式存储
      • 二叉树常用的是二叉链表
      • 结点中包含数据域和若干指针域(至少2个)
      • 如果需要结点能够指向双亲结点,那么可以用3叉链表
  • 线索二叉树是一种物理结构

    • 加上线索的二叉树称为**线索二叉树**
      • 线索二叉树中,二叉链表结点结构(ThreadNode)中包含
        • 左右指针(lchild/rchild),指针类型为
        • 左右线索标志(ltag/rtag)
  • 线索二叉树利用空指针域配合标记位,可以加速查找节点的前驱/后继

  • 对于线索二叉树,树中的2度结点是没有线索的(因为度为2的结点的指针域全被他的左右孩子占用了)

  • 线索二叉树分为三种(他们分别对应于险种二叉树的顺序遍历)

    • 先序线索二叉树
    • 中序线索二叉树
    • 后序线索二叉树

线索二叉树的空指针剩余问题

  • 假设二叉树线索化后(指针域和标志位相应的被被修改)
    • 比如x序线索二叉树遍历(x可以取,,)
    • 先将其xOrderTraverse序列写出(比如:ABCDE)
      • 首先要考察的是首位结点A&E
        • 他们各自可能提供0个或1个空指针域
        • 先看首尾结点是否为0/1度结点
        • 如果是2度结点,也不提供空指针域
      • 其余结点位于序列内部(不提供空指针域)
        • 他们要么为二度结点(没有空指针域/线索)
        • 并且,他们都既有前驱又有后继,因此注定不会贡献空指针域
    • 对于具体的:先/中/后 序,可以有更进一步的结论

线索二叉树的遍历

  • 线索二叉树的遍历应当充分利用线索指针(所以这里避开递归方案)
  • 对于先序线索二叉树和中序线索二叉树,它们的遍历可以沿着根结点的后继顺次访问就可以直接完成那边离
  • 对于后续线索二叉树,它的遍历稍微多一些细节,需要用到栈
    • 比如结点x作为某个结点T右孩子,x本身又有右孩子,那么x的有指针显然被他的右孩子占用掉,没有更多的右指针可以用来指向后继结点
      • 至于x的左指针,那是用来指向前驱的,因此对于x的后继也帮不上忙
      • 但是可以考虑使用具有指向双亲结点的三叉链来表示

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

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

相关文章

【云原生 • Kubernetes】配置管理 - Secret ConfigMap

本文导读一、机密配置抽象 Secret1. 认识 Secret2. Secret 的使用(1) 创建 Secret 加密数据(2) 将 Secret 以变量形式挂载到 pod 容器二、配置抽象 ConfigMap1. 认识 ConfigMap2. ConfigMap 的使用(1) 创建配置文件(2) 创建 ConfigMap(3) 将 ConfigMap 以变量形式挂载到 pod 容…

如何保存el-pagination组件的分页状态。

一文细解如何保存组件的分页状态。 文章目录一文细解如何保存组件的分页状态。背景一、实现原理二、代码展示1.分页组件模板背景 使用element-plus的分页组件搭建页面的时候,经常会出现这样一种情况:分页为列表页,当从列表页点击某一项进入详…

HTTP协议4)----对于数据链路层的详细讲解

꧁ 大家好,我是 兔7 ,一位努力学习C的博主~ ꧂ ☙ 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步❧ 🚀 如有不懂,可以随时向我提问,我会全力讲解~💬 &…

Springboot2.x仿B站项目第五章查询Es和内容推荐功能实现笔记及源码

文章目录系统全局模块的开发1.系统全文搜索1.1docker 下安装ES以及kibana1.2 配置Es的相关的yaml和configuration1.3 ES全文检索需求视频投稿搜索查询2.观看记录的统计2.1观看视频的添加信息2.2查询观看记录3.用户视频推荐4.视频弹幕遮罩其他章节系统全局模块的开发 本章主要实…

嵌入式分享合集67

一、CAN的接口保护电路 在一个模块上,由于是中转的CAN,需要从两个不同的连接器上连接出去(这种情况是根据客户的需求而定的)。 一般的设计如图: 一般的,我们最多使用两个电压斜坡控制电容(C2和…

Windows如何生成公钥和私钥

Windows如何生成公钥和私钥 方法一)使用git命令 一. 首先安装git二. 桌面上右键 Git Bash Here三. 命令ssh-keygen -t rsa然后 一直enter 四. 将公钥放到服务器上就可以使用SSH链接了. 方法二)使用openssl生成公钥和私钥 参考链接:https://blog.csdn.net/cduoa/article/deta…

组播路由协议——PIM DM工作机制

目录 扩散、剪枝机制 嫁接机制 状态刷新机制 断言机制 采用“推(Push)”的方式转发组播报文并生成组播表,建立SPT(最短路径树)转发组播报文。它假定每条链路都有接收者,在每条链路上都直接推送组播流量…

大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业

🌩️ 精彩专栏推荐👇🏻👇🏻👇🏻 💂 作者主页: 【进入主页—🚀获取更多源码】 🎓 web前端期末大作业: 【📚HTML5网页期末作业 (1000套…

Oracle 常用的经典SQL查询

/*1、查看表空间的名称及大小*/ select t.tablespace_name, round(sum(bytes / (1024 * 1024)), 0) ts_sizefrom dba_tablespaces t, dba_data_files dwhere t.tablespace_name d.tablespace_namegroup by t.tablespace_name; /*2、查看表空间物理文件的名称及大小*/ select…

vue3 模版语法

App.vue 注释掉首页的文本内容&#xff0c;只剩下对应的图标即可。 <div class"wrapper"><!-- <HelloWorld msg"You did it!day day up 自己更新" /> --></div></header><main><!-- <TheWelcome /> -->&…

“发展与治理”2022元宇宙共治大会成功举行

2022年9月24日下午&#xff0c;“发展与治理”2022元宇宙共治大会暨《元宇宙发展与治理》课题征求意见会、元宇宙产业委数字藏品发展研讨会议&#xff0c;在央链直播平台线上召开&#xff0c;本次会议汇聚众多高科技产业引领者和建设者&#xff0c;以及数权藏品众多流量平台共聚…

Navicat设置utf8mb4后保存emoji仍然报错的解决方法

一、前言 最近遇到一个问题&#xff0c;需要查库并导出报表&#xff1b; 由于报表比较特殊&#xff0c;程序没有实现&#xff0c;因此准备先查询生产库、复制为insert语句&#xff0c;然后在本地Navicat里执行、处理、再导出xls&#xff0c;这样快一些。 但是&#xff0c;没想…

SwiftUI AR教程之如何使用 SwiftUI 按钮在 RealityKit 中切换前后摄像头(教程含源码)

iOS AR 开发快速指南 如果您正在为 iOS 构建增强现实体验,您可能希望让您的用户能够在前置(又称“自拍”或“正面”)摄像头和后置(又称“世界侧”)摄像头之间切换。这是有关如何将此功能添加到您的应用程序的基本教程。 基本设置 首先,让我们从 Xcode 中的 Augmented …

Nginx系列之反向代理过程

nginx通过proxy模块对上游服务使用http/https协议进行反向代理&#xff0c;下图是反向代理处理过程 在读取客户端发送的请求时&#xff0c;如果proxy_request_bufferringon,那么读取完整的包体后再发送给后端服务&#xff0c;如果 proxy_request_bufferringoff&#xff0c;则是…

DDL操作表-查询和DDL操作表-创建

DDL操作表-查询 1.C(Create):创建 2.R(Retrieve):查询 3.U(Update):修改 4.D(Delete):删除 R(Retrieve):查询 查询某个数据库中所有的表名称show tables;查询表结构desc 表名; DDL操作表-创建 C(Create):创建 1.语法:create table 表名(列名  数据类型1,列…

指针初阶详解

目录序言地址指针是什么指针和指针变量为什么定义指针指针指针的大小类型指针的解引用指针-整数指针运算指针 - 指针指针比较野指针二级指针指针数组序言 指针这个模块是C语言里面比较难理解的的,学习成本倒是不高,就是有点费脑子.我们这里重点关注什么是指针和指针的用法.这篇…

Fast.ai 的新课来了,给你详细介绍 Stable Diffusion 原理

最近跟学生们学了个新词儿&#xff0c;叫做「双厨狂喜」。一般形容两个知名创作者合作出来的作品 ------ 例如视频或者直播等 ------ 很受大伙儿欢迎。这次&#xff0c;告诉你一个好消息&#xff0c;fast.ai 要和 Huggingface, Stability.ai&#xff08;Stable Diffusion 作者之…

[BJDCTF2020]EasySearch

解题&#xff1a; 进入环境只有 一个登录框&#xff0c;一般我的思路都是先用 万能密码登录一下&#xff0c;不行的话就扫源码 发现 index.php.swp 文件 <?phpob_start();//加密function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234…

PDF转word格式如果失败了,可以这样做

PDF是可以直接转成Word格式&#xff0c;方法也很简单&#xff0c;只需要把PDF另存为就可以了。 首先&#xff0c;在PDF的【文件】下选择【另存为】&#xff0c;然后选择新的保存路径。 出现新的对话框后&#xff0c;在【保存类型】那里选择【Word】格式&#xff0c;再点击保存…

连接打印机出现错误0X00000709怎么解决?

在使用打印机的时候&#xff0c;出现系统提示&#xff1a;操作无法完成&#xff08;错误0x00000709&#xff09;&#xff0c;再次检查打印机名称&#xff0c;并确保打印机已连接到网络。该怎么办呢&#xff1f;下面小编总结了这个问题的几种解决办法&#xff0c;总有一种适合你…