算法笔记:二叉树

news2024/11/20 16:28:48

1 基本二叉树

  • 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为“左子节点”和“右子节点”。
    • 二叉树的根是唯一没有父节点的节点,而所有其他节点都有一个父节点和零个或两个子节点。

1.1 基础术语

  • 节点(Node): 二叉树的基本单位。每个节点都有一个关键字(或称为“键值”或“数据”)。
  • 根节点(Root Node): 没有父节点的节点。
  • 叶节点(Leaf Node): 没有子节点的节点。
  • 子树(Subtree): 任何节点都可以视为其下的所有节点组成的一个新树。
  • 深度(Depth): 从根节点到某一节点的简单路径上的边数。
  • d层(Level): 树中所有深度为d的节点的集合。

1.2 二叉树的遍历

以如下二叉树为例

1.2.1 前序遍历

 先访问根节点,然后访问左子树,再访问右子树

ABDHIEJCFKG

1.2.2 中序遍历 

先访问左子树,再访问根节点,最后访问右子树

HDIBEJAFKCG

1.2.3 后序排列

 先访问左子树,再访问右子树,最后访问根节点

HIDJEBKFGCA

1.2.4 层次遍历

逐层的从根节点开始,每层从左至右遍历

ABCDEFGHIJK

2 斜二叉树

只有左子节点或只有右子节点的二叉树称为斜二叉树

3 满二叉树

所有的分支要么左右子节点都有,要么没有子节点,且所有叶子结点都在同一层上

4 完全二叉树

除了最后一层外,每一层都是完全填满的,并且所有节点都尽量向左填充

完全二叉树特点:

  • 叶子结点只能出现在最下两层;
  • 最下层的叶子结点一定集中在左边并且连续;
  • 若结点度为1,则该节点只有左子节点;
  • 完全二叉树的深度为\left \lceil \log_2(n+1) \right \rceil (n是树中节点的数量)
  • 在高度为h的完全二叉树中,节点数最少为2^{h-1},最多为2^h-1
  • 对于个索引为i的点(索引从1开始计数)
    • 父节点(若存在)的索引是\left \lfloor i/2 \right \rfloor
    • 左子节点(若存在)的索引是2i
    • 右子节点(若存在)的索引是2i+1

满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树

5 线索二叉树

  • 线索二叉树是一种对二叉树的改进,旨在通过线索(也就是额外的指针)加速对树的遍历操
  • 在普通的二叉树中,每个节点有两个子节点:左子节点和右子节点。但有些节点的子节点可能为空,这些空指针字段不存储任何信息
  • 线索二叉树通过利用这些空指针字段来存储与当前节点在某种遍历顺序(如前序、中序或后序)下相邻的节点。
    • 这样,在遍历树时,就不需要使用栈或递归,从而提高了遍历的速度
  • 在线索二叉树中,每个节点有两个额外的标志位,分别表示左指针和右指针是否被用作线索
    • 如果左子节点为空,则左指针字段存储该节点在某种遍历顺序下的前驱节点
    • 如果右子节点为空,则右指针字段存储该节点在某种遍历顺序下的后继节点

5.1 创建线索二叉树

创建线索二叉树通常需要两次遍历

  1. 第一次遍历是普通的前序、中序或后序遍历,用于建立二叉树的基本结构。
  2. 第二次遍历用于添加线索。这通常通过保存前一个访问的节点并在访问下一个节点时更新其线索来完成。

5.2 优缺点

优点

  • 遍历更快:由于已经存储了前驱和后继信息,遍历操作更加高效。
  • 不需要额外的数据结构:不需要使用栈或递归。

缺点

  • 额外的存储开销:需要额外的字段来存储线索和标志位。
  • 修改复杂:插入或删除节点时,需要更新相应的线索,这使得操作更加复杂。、

参考内容:数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)-腾讯云开发者社区-腾讯云 (tencent.com)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务运营 | MSOR文章精选:远程医疗服务中的统计与运筹(二)

作者信息:王畅,陈盈鑫 编者按 在上一期中,我们分享了与远程医疗中运营管理问题相关的两篇文章。其一发表在《Stochastic Systems》,旨在使用排队论与流体近似的方法解决远程医疗中资源配置的问题;其二发表在《Managem…

R_I相关指令函数(SMART PLC梯形图代码)

大部分小型PLC可能并没有R_I(浮点数转单字)指令,这篇博客我们介绍简单实用的一些转换FC,这些FC其实并不复杂,但是可以大大简化我们的代码量,使代码阅读起来更简介明了。SMART PLC的ABS()指令请查看下面文章链接: PLC绝对值指令AB…

04 Linux补充|C/C++

目录 Linux补充 C语⾔ C语言中puts和printf的区别? Linux补充 (1)ubuntu安装ssh服务端openssh-server命令: ubuntu安装后默认只有ssh客户端,只能去连其它ssh服务器;其它客户端想要连接这个ubuntu系统,需要安装部署…

LLM大模型推理加速 vLLM

参考: https://github.com/vllm-project/vllm https://zhuanlan.zhihu.com/p/645732302 https://vllm.readthedocs.io/en/latest/getting_started/quickstart.html ##文档 加速原理: PagedAttention,主要是利用kv缓存 使用: #…

JVM | Java执行引擎结构及工作原理

引言 Java虚拟机(JVM)和其复杂性 在我们先前探讨的文章中,我们已经深入到了Java虚拟机(JVM)的内部,透视了其如何通过元空间存储类的元数据和字节码。JVM的设计初衷是为了实现跨平台兼容性,但随…

JavaScript构造函数

1、构造函数: 是一个函数,是通过new运算符进行调用,生成一个特殊的对象并返回。 function 函数名([参数]){ this.属性名 ‘属性值’ ... this.属性名 function([参数]){ 函数体语句 } } 通常情况下,建议构造函数的首字母大写 …

如何修复损坏的MP4视频文件?

随着智能设备拍摄功能的不断强大,随拍摄成本逐渐降低,越来越多的人喜欢用视频记录我们的生活,并上传抖音、快手、B站等视频网站 但在拍摄视频时也可能遇到一些突发情况,如手机没电断电终止拍摄、视频文件传输中断等,拍…

【Semidrive】解决 X9HP reboot 导致 Android 崩溃的问题

本篇文章介绍如何解决 X9HP 平台的 AP1 域中插着 u 盘时运行 reboot 导致 Android 系统崩溃的问题,软件版本是 X9 PTG4.0,硬件环境是 X9H 开发板 X9H_REF_A04。一、问题原因 在调试过程中遇到插着 u 盘时用 adb shell reboot 命令或直接在串口中 reboot …

国际网页短信软件平台通道搭建与后台定制-移讯云短信系统

国际网页短信软件平台通道搭建与后台定制-移讯云短信系统 这里先介绍下客户的定制需求,稍候放出开发构架和开发思路 我们根据市场需要,开发了一套可以接入国际通道的短信系统。 支持地区通道分流,支持关键字,关键词通道分流&…

ELK框架Logstash配合Filebeats和kafka使用

ELK框架Logstash配合Filebeats和kafka使用 本文目录 ELK框架Logstash配合Filebeats和kafka使用配置文件结构input为标准输入,output为标准输出input为log文件output为标准输出output为es input为tcpspringboot配置logstash配置 input为filebeatsfilebeats配置logsta…

【脑机接口】通过任务判别成分分析提高单独校准的 SSVEPBCI 的性能

题目:Improving the Performance of Individually Calibrated SSVEP-BCI by Task Discriminant Component Analysis **1. 摘要****2. 方法***A.任务相关成分分析**B.任务判别成分分析**C.评估* **- 结果****- 结论** 1. 摘要 脑机接口(BCI)为…

Python异步请求处理框架

在互联网时代,我们的程序需要处理大量的网络请求。为了提高性能和用户体验,我们需要一个高效的异步请求处理框架。本文将引导您从头开始编写一个Python框架,实现异步请求及响应管理。 设计思路与关键技术点 a. 异步编程的基本概念 异步编程…

权限提升-Linux提权-环境变量文件配合SUID提权

LINUX系统提权项目介绍 一个综合类探针: Linux:https://github.com/liamg/traitor 一个自动化提权: Linux:https://github.com/AlessandroZ/BeRoot 两个信息收集: Linux:https://github.com/rebootuser/Lin…

OpenWAF配置本地资源访问

OpenWAF配置本地静态资源安全访问 介绍 OpenWAF(Web Application Firewall)是一个开源的Web应用防火墙,用于保护Web应用程序免受各种网络攻击。它通过与Web服务器集成,监控和过滤对Web应用程序的流量,识别和阻止潜在…

搭建最简单的SpringBoot项目

1、创建maven项目 2、引入父pom <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version> </parent> 3、引入springboot-web依赖 <dependency…

UG\NX CAM二次开发 遍历组中的工序 UF_NCGROUP_ask_member_list

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 遍历组中的工序 UF_NCGROUP_ask_member_list 效果: 代码: void GetAllOperTag(tag_t groupTag, vector<tag_t> &vOperTags) {int count=0;tag_t * list;UF_NCGROUP_ask_member_li…

数学建模-大模型的对比

引用老哥数学建模视频 【ChatGPT 4.0】在数学建模中的应用&#xff01;算法Matlab写作&#xff0c;全面测评六款大模型软件&#xff0c;直接使用&#xff01; 哪些问题可以问GPT 一、算法应用 1帮我总结一下数学建模有哪些预测类算法&#xff1f; 2灰色预测模型级比检验是什么…

架构师成长之路|Redis 安装介绍以及内存分配器jemalloc

安装 Redis官网:https://redis.io/download/ 下载安装二进制文件 可下载安装最新版Redis7.2.0,或者可选版本6.x 我这里下载6.2.13和7.2最新版本,后面我们都是安装6.2.13版本的信息进行讲解 二进制文件安装步骤 安装前期准备: 安装gcc yum install gcc 压缩文件 tar -xzf re…

无需公网IP,实现远程访问群晖Drive并挂载为电脑磁盘的方法

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

【C#项目实战】控制台游戏——勇士斗恶龙(1)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…