二叉树的概念、存储及遍历
一、二叉树的概念
1、二叉树的定义
二叉树( binary tree)是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。
二叉树的特点是:
(1)每个结点最多有两棵子树,故二叉树中不存在度大于 2 的结点。
(2)二叉树是有序的,其次序不能任意颠倒,即使树中的某个结点只有一棵子树,也要区分它是左子树还是右子树。
二叉树具有以下 5 种基本形态:
1、
2、特殊的二叉树
在实际应用中,常会用到以下几种特殊的二叉树。
1.斜树
所有的结点都只有左子树的二叉树称为左斜树,所有的结点都只有右子树的二叉树称为右斜树,在斜树中,每层只有一个结点,因此斜树的结点个数与其深度相同.
2.满二叉树
在一棵二叉树中,若所有的分支结点都存在左子树和右子树,且所有的叶子都在同一层上,则称为满二叉树。
其特点是:
- 叶子只能出现在最下一层
- 只有度为 0、度为 2 的结点
由于满二叉树的特性可知:满二叉树在同样深度的二叉树中结点个数、叶结点个数最多。
3.完全二叉树
对一棵具 n 个结点的二叉树按层序编号,若编号为 i 的结点与同样深度的满二叉树中编号 i 的结点在二叉树中的位置完全相同,则称为完全二叉树,那么显然有:满二叉树是完全二叉树
其特点是:
(1)若i ≤ n / 2, 则结点i为分支结点,否则为叶子结点。
(2)叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
(3)若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(重要特征)。
(4)按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i 的结点均为叶子结点。
(5)若n为奇数,则每个分支结点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为n / 2 )只有左孩子,没有右孩子,其余分支结点左、右孩子都有。
简单来说,在满二叉树中,从最后一个结点开始,连续去掉任意个的结点,即是一棵完全二叉树
3、二叉树的性质
1.非空二叉树的第 i 层上行最多有 个结点
2.在一棵深度为 k 的二叉树中,最多有 个结点,最少有 k 个结点
推论:深度为 k 且具 个结点的二叉树一定是满二叉树,但深度为 k 具有 k 个结点的二叉树不一定是斜树
3.任意一棵树,若结点数量为n ,则边的数量为n − 1 。
4.在一棵二叉树中,若叶结点个数为 ,度为 2 结点个数为 ,那么有:
5.具有 n 个结点的完全二叉树的深度为 ,
6.对完全二叉树按从上到下、从左到右的顺序依次编号1 , 2,...,n,则有以下关系:
(1)若 i=1,则:结点 i 为根节点;若 i>1,则:结点 i 的父结点编号为 i / 2,即当i 为偶数时, 它是双亲的左孩子;当i为奇数时,它是双亲的右孩子。
(2)若2 i ≤ n 时,结点i 的左孩子编号为2 i , 否则无左孩子。
(3)若2 i + 1 ≤ n 时,结点i 的右孩子编号为2 i + 1 ,否则无右孩子。
(4)结点i 所在层次(深度)为
4、二叉树的存储结构
1、顺序存储结构
二叉树的顺序存储结构是用一维数组存储二叉树中的结点,并用结点的存储位置表示结点间的逻辑关系(父子关系)
由于二叉树本身不具有顺序关系,因此二叉树的顺序存储结构要解决的关键问题是如何利用数组下标来反映结点间的逻辑关系。
由于完全二叉树中结点的层序编号可以唯一反映结点间的逻辑关系,因此对于一般的二叉树,可以添加一些不存在的空结点,使其成为一棵完全二叉树,再利用一维数组存储。
具体步骤为:
1、根节点编号为 1
2、若某结点 i 有左孩子,则其左孩子编号为 2i
3、若某结点 i 有右孩子,则其右孩子编号为 2i+1
缺陷:顺序存储会造成存储空间的浪费,最坏的情况是右斜树,一棵深度为 k 的右斜树,却要分配 个存储空间。
因此,二叉树的顺序存储结构一般仅用于存储完全二叉树。
2、链式存储结构
既然顺序存储适用性不强,我们就要考虑链式存储结构。二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。
lchild | data | rchild |
其中data是数据域,lchild 和rchild都是指针域,分别存放指向左孩子和右孩子的指针。
以下是我们的二叉链表的结点结构定义代码。
/*二叉树的二叉链表结点构造定义*/
/*结点结构*/
struct BiTNode{TElemType data; //结点数据BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree; //根结点
容易验证,在含有n 个结点的二叉链表中,含有n + 1 个空链域。
二、遍历二叉树
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
1、先序遍历
先序遍历(PreOrder) 的操作过程如下:若二叉树为空,则什么也不做,否则,
1)访问根结点;
2)先序遍历左子树;
3)先序遍历右子树。
2、中序遍历
中序遍历( InOrder)的操作过程如下:若二叉树为空,则什么也不做,否则,
1)中序遍历左子树;
2)访问根结点;
3)中序遍历右子树。
3、后序遍历
后序遍历( InOrder)的操作过程如下:若二叉树为空,则什么也不做,否则,
1)中序遍历左子树;
2)中序遍历右子树。
3)访问根结点;
三种遍历算法中,递归遍历左、右子树的顺序都是固定的,只是访问根结点的顺序不同。不管采用哪种遍历算法,每个结点都访问一次且仅访问一次,故时间复杂度都是O(n)。在递归遍历中,递归工作栈的栈深恰好为树的深度,所以在最坏情况下,二叉树是有n个结点且深度为n的单支树,遍历算法的空间复杂度为O(n)。
相关文章:
二叉树的概念、存储及遍历
一、二叉树的概念 1、二叉树的定义 二叉树( binary tree)是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。 二叉树的…...
【面试题】智力题
文章目录 腾讯1000瓶毒药里面只有1瓶是有毒的,问需要多少只老鼠才能在24小时后试出那瓶有毒。有两根不规则的绳子,两根绳子从头烧到尾均需要一个小时,现在有一个45分钟的比赛,裁判员忘记带计时器,你能否通过烧绳子的方…...
【SpringBoot集成Redis + Session持久化存储到Redis】
目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …...
day49:QT day2,信号与槽、对话框
一、完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个…...
Meta分析核心技术
Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...
Gof23设计模式之责任链模式
1.概述 责任链模式又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止…...
数字孪生和元宇宙:打造未来的数字边界
数字孪生和元宇宙是近两年来被热议的两个概念,但由于技术的交叉两者也极易被混淆。本文希望带大家深入探讨一下这两者之间的关系,以及它们如何一起构建了数字时代的新格局。 1. 数字孪生的本质 数字孪生是一种虚拟模型,它通过数字手段对现实…...
【新版】系统架构设计师 - 软件架构设计<新版>
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 软件架构设计<新版>考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD(ABSDM模型)的开发过程 软件架…...
Linux面试题
当准备 Linux 面试时,以下是一些可能会遇到的常见 Linux 面试题: 1. 什么是Linux?解释一下Linux操作系统的特点。 2. 什么是Linux内核?Linux内核的作用是什么? 3. 如何在Linux系统上查看当前的IP地址和子网掩码&#…...
NODEJS版本管理工具
一、使用NVM 下载 Linux下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh widows下载地址 https://github.com/coreybutler/nvm-windows/releases 安装Node.js版本: nvm install 14.16.0 切换Node.js版本: nvm use …...
【个人笔记本】本地化部署 类chatgpt模型 详细流程
不推荐小白,环境配置比较复杂 全部流程 下载原始模型:Chinese-LLaMA-Alpaca-2linux部署llamacpp环境使用llamacpp将Chinese-LLaMA-Alpaca-2模型转换为gguf模型windows部署Text generation web UI 环境使用Text generation web UI 加载模型并进行对话 准…...
RFID与人工智能怎么融合,RFID与人工智能融合的应用
随着物联网技术的不断发展,现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器,将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输,然后经由人工智能算法进行分析、建模和预测…...
性能测试 —— Jmeter 常用三种定时器
1、同步定时器 位置:HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用户阻塞线程,知道线程数达到预先配置的数值,才开始执行…...
每个高级前端工程师都应该知道的前端布局
首发于公众号 大迁世界,欢迎关注。📝 每周一篇实用的前端文章 🛠️ 分享值得关注的开发工具 😜 分享个人创业过程中的趣事 快来免费体验ChatGpt plus版本的,我们出的钱 体验地址:https://chat.waixingyun.cn 可以加入网站底部技术群,一起找bug,另外新版作图神器已上线…...
100道基于Android毕业设计的选题题目,持续更新
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好,我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目,以及基于an…...
idea显示git分支信息(GitToolBox插件)
效果图 说明 本身idea在右下角会有git分支信息,但是显示的当前打开文件的分支信息,并且不够显眼 解决 1、安装插件(GitToolBox插件) 2、修改idea.properties project.tree.structure.show.urlfalse ide.tree.horizontal.default.autoscrollingfalse将…...
Hadoop知识点之Hadoop发展历程
一、Hadoop名字的起源 Hadoop这个名字不是一个缩写,它是一个虚构的名字。 该项目的创建者,Doug Cutting如此解释Hadoop: 这个名字是我孩子给一头吃饱了的棕黄色大象命名的。我的命名标准就是简短,容易发音和拼写,没有…...
阿里云无影电脑:免费体验无影云电脑3个月
阿里云无影云电脑免费领取流程,免费无影云电脑配置为4核8G,可以免费使用3个月,阿里云百科分享阿里云无影云电脑(云桌面)免费申请入口、申请流程及免费使用限制条件说明: 目录 阿里云无影云电脑免费申请入…...
菜鸟教程《Python 3 教程》笔记(20):面向对象
菜鸟教程《Python 3 教程》笔记(20) 20 面向对象20.1 面向对象技术简介20.2 创建类20.2.1 类定义20.2.2 实例化20.2.3 初始化20.2.4 类变量、实例变量20.2.5 类方法、实例方法、静态方法 20.3 访问可见性20.3.1 property装饰器 20.4 动态性20.4.1 __slot…...
vue2编辑markdown
效果 npm i mavon-editor --save 只能全局注册 使用...
PCB走线规则
1、线间距。 这里应该遵循3W规则,所谓3W就是为了减少线间串扰,应保证线间距足够大,当线中心不少于3倍线宽,则可 保持70%的电场不互相干扰。如要达到98%的电场不互相干扰,可使用10W的间距。——这是查阅华为PCB布线规则…...
webpack静态资源上传到CDNS (阿里云 OSS,亚马逊 AWS S3,七牛云 Qiniu Cloud Kodo)webpack-plugin-cdns
webpack-plugin-cdns 是一个 Webpack 插件,用于实现将前端项目中的资源(如 JavaScript、CSS、图片等)上传到 CDN(OSS、S3、Kodo) 服务器。从而完成资源的 CDN 加速。 在开发前端项目时,我们通常会将静态资源放在本地服务器上&…...
python 异常
1.捕获异常 2.密码爆破 3....
stm32--独立看门狗
最近学习到独立看门狗,总结下笔记 1.看门狗的作用:防止程序异常跑飞,跑飞时,进行系统复位,从而不会导致代码瘫痪,奔溃卡死在某段程序。 2.看门狗其实是12bit递减计数器,,减到0会产…...
vue3中css使用script中定义的变量
代码 <template><div class"box">haha</div> </template><script setup lang"ts"> const boxWidth 500px </script><style lang"scss"> .box {width: v-bind(boxWidth);height: 200px;background-c…...
Ubuntu 22.04 安装配置 flatpak
Ubuntu 22.04 安装配置 Flatpak 安装 Flatpak sudo apt install flatpakFlatpak 仓库配置 官方仓库 https://flathub.org/repo/flathub上交大镜像 https://mirror.sjtu.edu.cn/flathub flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatp…...
oracle创建数据库以及用户,并导入dmp格式数据
oracle创建数据库以及用户,并导入dmp格式数据 安装可参考之前的文章https://blog.csdn.net/qq_43421954/article/details/132717546?spm1001.2014.3001.5501 首先创建表空间(也就是其他数据库所谓的数据库) 使用的是navicat,连接配置可以参…...
[deeplearning]pytorch实现softmax多分类问题预测训练
写在前面:俺这两天也是刚刚加入实验室,因为之前的学习过程中用到更多的框架是tensorflow,所以突然上手pytorch多少有些力不从心了。 这两个框架的主要区别在与tensorflow更偏向于工业使用,所以里面的很多函数和类都已经封装得很完…...
【C++初阶】动态内存管理
👻内容专栏: C/C编程 🐨本文概括: C/C内存分布、C语言动态内存管理、C动态内存管理、operator new与operator delete函数、new和delete的实现原理、定位new表达式、常见面试问题等。 🐼本文作者: 阿四啊 …...
Mac电脑安装Zulu Open JDK 8 使用 spring-kafka 消费不到Kafka Partition中的消息
一、现象描述 使用Mac电脑本地启动spring-kakfa消费不到Kafka的消息,监控消费组的消息偏移量发现存在Lag的消息,但是本地客户端就是拉取不到,通过部署到公司k8s容器上消息却能正常消费! 本地启动的服务消费组监控 公司k8s容器服…...
微信小程序购物平台/谷歌排名优化入门教程
linux常见报错有哪些?command not found 命令没有找到NO such file or directory 没有这个文件或者目录Permission denied 权限不足No space left on device 磁盘没有剩余空间File exists 文件已经存在Is a directory 这是一个目录Not a directory 这不是一个目录Wa…...
做网站怎么选择服务器的大小/全球搜是什么公司
首届5G创新发展高峰论坛于2016年9月22日在北京中国国际展览中心顺利召开。作为2016年中国国际信息通信展-“ICT 中国2016高层论坛”的重量级分论坛,本次论坛以“加速5G创新,推进融合变革”为主题,由中国IMT-2020(5G)推进组牵头组织࿰…...
商城网站建设公司哪家好/aso推广方案
安装编译环境的软件可能会出现的问题下列软件包有未满足的依赖关系:libasound2: 破坏: libasound2-plugins (< 1.0.24-0ubuntu3)但是1.0.22-0ubuntu6 正要被安装libglib2.0-0: 破坏: gnome-control-center (< 1:3)但是1:2.30.0-0ubuntu4 正要被安装ppp: 破坏:…...
做外贸一般在什么网站/品牌推广的意义
作者:美国 Roy Osherove 在软件开发届,测试越来越得到重视.目前我们可以找到一些关于测试驱动,通用测试方法等书籍与材料,但专著与单元测试的书籍与指导材料却非常罕见.本书将从头开始,指导剖析如何写好单元测试,以至于让我们的软件更加可靠,甚至于利用测试驱动开发…...
设计素材网站0/公众号软文推广
LBS坐标转换,支持Wgs84、Gcj02、Bd09三种坐标系的互转。 public class GpsCoordinate {#region 地球参数private static readonly double pi 3.1415926535897932384626;private static readonly double a 6378245.0;private static readonly double ee 0.0066934…...
温州优化网站方法/app优化网站
在练习循环删除list中元素时遇到了一点问题。最开始写的代码是 for i in range(len(list)):del list[i] 这样写到后来会报错,原因是随着列表元素的删除和i的增加,对列表元素的访问会越界。 后来改成了如下代码 while i < len(list):del list1[i] 结果…...