二叉树学习

news2024/11/23 13:38:24

树是n个结点的有限集合,当n=0时为空树,在任意一颗非空的树中,有且只有一个特定的称为根的结点,当n>1时,其余结点又可以分为m个不相交的有限集,其中每一个集合又是一棵树,并且称为根的子树

树的结点包含一个数据元素以及若干指向其子树的分支,结点拥有的子树称为结点的度,度为0的结点称为叶结点或者终端结点,度不为0的结点称为非终端结点或者分支结点,除根结点之外,分支结点称为内部结点,树的度是树内部各个结点的度的最大值

结点的子树的根称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子之间互相称为兄弟

树的深度:树中结点的最大层次

树的存储结构

  1. 顺序存储结构
  2. 链式存储结构

二叉树

对于在某个阶段都是两种结果的情形,比如开关,01,上下,对错,真假等,都适合使用树状结构来进行建模,这种树被称为二叉树

》》二叉树特点

  1. 每个节点必须有两颗子树
  2. 左子树和右子树是有顺序的,次序不能颠倒
  3. 要能够区分左子树和右子树

二叉树的基本形态

  1. 空二叉树
  2. 只有一个根结点
  3. 根结点只有左子树
  4. 根结点只有右子树
  5. 根结点既有左子树也有右子树

特殊二叉树

1.斜树:所有的结点都只有左子树的二叉树称为左斜树,所有结点都只有右子树的二叉树称为右斜树

2.满二叉树:在一颗二叉树中,所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层次上,这样的二叉树称为满二叉树

3.完全二叉树:对于一颗具有n个结点的二叉树按照层次编号,如果编号为i的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,那么这颗二叉树称为完全二叉树

此时左边的为完全二叉树,而右边的不是,因为节点的编号不是连续的,C缺少了左子树

完全二叉树特点:

  1. 叶子结点只能出现在最下面两层
  2. 最下面的叶子一定集中在左部的连续位置
  3. 倒数第二层,如果有叶子结点,一定都在右边连续的位置
  4. 如果结点的度为1,那么该结点只有左子树
  5. 同样的二叉树,完全二叉树的深度最小

二叉树的性质

  1. 在二叉树的第i层至多有2^(i-1)个结点
  2. 深度为k的二叉树至多有2^(k-1)个结点
  3. 对于任何一颗二叉树,如果其终端节点数为n,度为2的节点数为m,则n=m+1

》》二叉树的顺序存储结构

虽然顺序结构对于树这种一对多的关系结构实现起来比较困难,但是二叉树具有特殊性,二叉树的结点是按照特定的顺序进行编号的,因此可以使用顺序存储结构也可以实现二叉树,但是考虑的特殊情况(每个结点只有右子树),就会造成内存空间的极大浪费,因此顺序存储结构一般只适用于完全二叉树

二叉树的链式存储结构

二叉树的节点

为二叉树的每个结点都设置两个指针域和一个数据域,分别用来指向其子树和存储数据

其中data就为二叉树节点的数据域,存储节点的数据

ltree和rtree为指针域,分别指向其左子树和右子树

二叉树的遍历方法

1.前序遍历

如果二叉树为空,则返回空,否则返回根结点,否则前序遍历左子树,再前序遍历右子树

只要传入的二叉树不为空,则打印出当前节点的值,再递归调用函数遍历其左子树,最后递归调用函数遍历其又子树

2.中序遍历

如果二叉树为空,则返回空,否则中序遍历左子树,访问根结点,再中序遍历右子树

3.后序遍历

如果二叉树为空,则返回空,否则后序遍历左子树,后序遍历右子树,访问根结点

4.层次遍历

如果二叉树为空,则返回空,否则从根结点开始,从上往下逐层遍历,在同一层中,按照从左到右的顺序进行访问

这是通过队列来实现的

二叉树遍历性质

  1. 已知一个中序遍历和前序遍历可以确定唯一的二叉树
  2. 已知一个中序遍历和后序遍历可以确定唯一的二叉树

注:如果已知前序和后序遍历是不能确定一颗二叉树的

二叉树的建立

使用补空法建立二叉树,如果结点为#,则该节点为空

建立二叉树算法:

  1. 首先捕获一个值,判断是否为#,如果为#,二叉树为空
  2. 否则循环捕获节点信息,为结点分配内存,分配失败则退出
  3. 递归创造左右结点

二叉树的叶子数,深度,以及节点数

叶子数:只要该节点没有左右子树,那么该节点就为二叉树叶子

深度:找出左右子树的最大深度,再加上根节点,就是该叶子数的深度

节点数:求出根节点左子树的节点数和右子树的节点数,再加上根节点就是该二叉树的节点数

线索二叉树

指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树,对二叉树以某种次序遍历使得其变为线索二叉树的过程称为线索化

线索化的实质就是将二叉树的空指针改为指向前驱或者后继的线索,由于前驱和后继的信息只能在遍历的过程中得到,所以线索化的过程就是修改空指针的过程

对于n个结点的二叉树,一共有2n个指针域,而真正使用的指针域只有n-1个,有n+1个指针域没有被利用,因此可以将空指针域的内容填充,让其指向其前驱点或后继

线索二叉树实现

需要两个变量来确定,二叉树的指针域是指向为其子树还是指向其前驱点

设为ltag,rtag,这两个变量为bool类型

当ltag为0时指向该结点的左子树,当ltag为1时指向该结点的前驱

当rtag为0时指向该结点的右子树,当rtag为1时指向该结点的后继

意义

如果所使用的二叉树需要经常进行遍历或者查找某些结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉树

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

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

相关文章

opencv 多线程读取和显示摄像头【python源码】

在Python中,使用OpenCV库实现多线程读取和显示摄像头通常涉及创建多个线程,每个线程负责从摄像头捕获视频帧并显示它们。但是,请注意,OpenCV本身并不直接支持多线程显示,因为cv2.imshow通常是在主线程中运行的。然而&a…

imu6xl点灯(C语言)

参考正点原子开发指南 根据原理图可以看出,我们需要设置低电平导通电路。 在原理图上找到LED0,对应IO为GPIO3 IO复用配置 IMX6UL每个引脚都可以复用 在用户手册第30章可以找到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03这个寄存器,地址为0x020E0068&…

JavaScript函数式编程

函数式编程 课程介绍 为什么要学习函数编程以及什么是函数式编程函数式编程的特性(纯函数、柯里化、函数组合等)函数式编程的应用场景函数式编程库Lodash 为什么要学习函数式编程 函数式编程是非常古老的一个概念,早于第一台计算机的诞生, 函数式编程…

gpt系列概述——从gpt1到chatgpt

GPT建模实战:GPT建模与预测实战-CSDN博客 OpenAI的GPT(Generative Pre-trained Transformer)系列模型是自然语言处理领域的重要里程碑。从2018年至2020年,该公司相继推出了GPT-1、GPT-2和GPT-3,这些模型在文本生…

是时候将 DevOps 可见性扩展到网络边缘了

尽管部署前运行了大量测试,但在部署应用程序后,性能问题经常让 DevOps 团队感到困惑。经过进一步调查,最常被忽视的问题是应用程序本身的分布式特性。从多个位置访问应用程序的最终用户永远不会拥有相同水平的互联网服务,因此在纽…

python使用ffmpeg分割视频为Hls分片文件/使用OpenSSL加密m3u8和TS文件

FFmpeg和OpenSSL是一个开源免费的软件,在官网上就能下载, FFmpage网址(建议选择文件名full结尾的文件):Builds - CODEX FFMPEG gyan.dev OpenSSL网址(建议选择win64的MSI文件):Win3…

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布,其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出,为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS:使用Wildcard享受不受网络限制的API调用,详情查看教程 继去年 9 月…

LinkedHashMap部分底层源码解析

JDK版本为1.8.0_271,LinkedHashMap继承了HashMap,LinkedHashMap在HashMap的基础上维护了一个双向链表,实现了可以根据插入顺序/访问顺序(accessOrderfalse/true)访问Map集合。 关于HashMap的原理可以参考HashMap部分底…

IOPaint部署,实现去水印效果

下载源代码 https://github.com/Sanster/IOPaint https://github.com/advimman/lama 创建虚拟环境 conda create --prefixD:\CondaEnvs\iopaint python3.10 conda activate D:\CondaEnvs\iopaint安装依赖包 pytorch最低2.0.0 # 查看cuda版本安装对应的pytorch nvcc -V # …

Prototype 原型

意图 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢? 不管是JDK1.7还是JDK1.8中,都不是直接用key的hashCode值直接与table.length-1计算求下标的,而是先对key的hashCode值进行了一个运算,JDK1.7和JDK1.8关于hash()的实现…

如何卸载干净 IDEA(图文讲解)

更新时间 2022-12-20 11:一则或许对你有用的小广告 星球 内第一个项目:全栈前后端分离博客项目,演示地址:Weblog 前后端分离博客, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot Mybatis Plus Vue 3.x Vit…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

给picgo上传的图片加个水印

之前给大家介绍了picgo和免费的图床神器。我们本可以开开心心的进行markdown写作了。 但是总是会有那么一些爬虫网站过来爬你的文章&#xff0c;还把你的文章标明是他们的原著。咋办呢&#xff1f;这里有一个好的办法就是把markdown中上传的图片加上自己的水印不就行了。 说干…

【复现】CVE-2024-29269 某国外路由器RCE漏洞_72

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 在 Telesquare TLR-2005Ksh 1.0.0 和 1.1.4 中发现的一个问题允许攻击者通过 Cmd 参数运行任意系统命令。 二 .漏洞影响 通过提交…

C语言---顺序表(二)

文章目录 前言1.准备工作2.代码的实现2.1.顺序表的创建、销毁和打印2.2.顺序表的扩容、头插\删、尾插\删2.2.1.扩容2.2.2.尾插2.2.3.头插2.2.3.尾删2.2.4.头删 2.3.指定位置之前插入/删除数据/查找数据2.3.1.指定位置之前插入数据2.3.2.指定位置之前删除数据2.3.3.查找特定数据…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

Linux-select剖析

一、select函数 select函数是IO多路复用的函数&#xff0c;它主要的功能是用来等文件描述符中的事件是否就绪&#xff0c;select可以使我们在同时等待多个文件缓冲区 &#xff0c;减少IO等待的时间&#xff0c;能够提高进程的IO效率。 select()函数允许程序监视多个文件描述符…

旋转编码器原理(超简单)

波形图 A相和B相的状态变化与旋转方向有关。当顺时针旋转时&#xff0c;A相引脚会先变化&#xff0c;然后是B相引脚。而逆时针旋转时&#xff0c;B相引脚会先变化&#xff0c;然后是A相引脚 这是两个引脚的实际波形采样&#xff0c;越密集的旋转的越快 可以发现特点&#xff0…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…