数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。
1、树的概念及结构
树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的,
在树这种数据结构中,最顶端的结点称为根结点。在树的使用过程中,由于树的逻辑关系很像人的遗传关系图谱,所以,一般将上一级的结点称为下一级结点的父结点,某一层级结点往上的结点称为该层结点的祖先。这里要注意的一点是:树形结构中,子树之间不能有交集,否则就不是树形结构。
1.1、树的相关概念
结点的度: 一个结点含有的子树的个数就称为该结点的度;如上图:A的度为6;
叶结点:度为0的结点称为叶结点; 如上图:B、C、H、I...等结点为叶结点;
分支结点:度不为0的结点称为分支结点; 如上图:D、E、F、G...等结点为分支结点;
父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点;
子结点:若有一个结点有父结点,则这个结点称为其父结点的子节点;如上图:B是A的子结点;
兄弟结点:处于同一层级的结点称为兄弟节点;
树的度:一棵树中,最大结点的度称为树的度;如上图:树的度为6;
结点的层次:从根开始定义,根为第1层,根的子结点为第2层,以此类推;
树的高度:树中结点的最大层次;如上图:树的高度为4;
堂兄弟结点:双亲结点在同一层级的结点称为堂兄弟结点;如上图:H、I互为堂兄弟结点;
结点的祖先: 从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先;
子孙: 以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙;
森林:由m(m>0)棵互不相交的树的集合称为森林;
1.2、树的表示
树的表示就比较复杂了,既要保存结点中要存储的数据,也要保存结点之间的相互关系。众多树的表示方法中,左孩子右兄弟表示法是最常用的方法。它的逻辑关系可以表示成下面的形式:
typedef int DataType;
struct Node
{struct Node* firstChild1; // 第一个孩子结点struct Node* pNextBrother; // 指向其下一个兄弟结点DataType data; // 结点中的数据域
};
2、二叉树
2.1、概念
一棵二叉树是结点的有限集合,该集合:1.或者为空,2.由一个根节点加上两颗别称为左子树和右子树的二叉树组成,
从上图可以看出:
1.二叉树不存在度大于2的结点
2.二叉树的子树有左右之分,次序不能颠倒,因此,二叉树是有序树。
对于任意的二叉树都是由以下几种情况符合而成的:
2.2、特殊的二叉树
1、满二叉树:一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为h,且结点数总是2^(h-1),那么它就是满二叉树。
2、完全二叉树:完全二叉树是效率很高的数据结构,对于高度为h的二叉树,它的h-1层的结点全满,第h层的结点是连续的情况下称为完全二叉树。要注意:满二叉树也是一种特殊的完全二叉树。
2.3、二叉树的性质
1、若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。
2、若规定根节点的层数为1,则深度为h的二叉树的最大结点树最大的结点数为2^h-1。
3、对于任何一颗二叉树,如果度为0其结点个数为n0,度为2的分支结点个数为n2,则有n0=n2+1。
4、若规定根结点的层数为1,具有n个节点的满二叉树的深度h=log(n+1),以2为底。
5、对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组对所有结点从0开始编号,则对于序号为i的结点有:
-
若i>0,i位置结点的双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
-
若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
-
若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
3、二叉树的顺序结构及实现
3.1、二叉树的顺序结构
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
3.2、堆
在二叉树的概念上限制一些条件就是堆。堆有两条性质:1.堆中某个结点的值总是大于或者不小于其父结点的值。2.堆总是一棵完全二叉树。
堆的实现我将单独写一篇博客来实现。
相关文章:
数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。 1、树的概念及结构 树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的, 在树这种数据结构中,最顶端的结点称为根结点。在树的…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3https://ext.dcloud.net.cn/plugin?id8159 点击即可。 注意数据来源: 选择的:valueName:选择下拉选择显示的显示屏...
HTTP中GET和POST的区别是什么?
HTTP定义: GET:用于获取资源,通常用于请求数据而不改变服务器的状态 POST:用于提交数据到服务器,通常会改变服务器的状态或产生副作用(如创建或更新资源) 参数传递方式: GET&…...
day04 企业级Linux安装及远程连接知识实践
1. 使用传统的网卡命名方式 在启动虚拟机时,按tab键进入编辑模式 添加命令: net.ifnames0 biosdevname0 这样linux系统会使用传统的网卡命名,例如eth0、eth1…… 2. 快照 做系统关键操作时,一定要使用快照(先将系统关机) 3.…...
jvm核心组件介绍
1. 类加载器(ClassLoader): • 想象它是一个快递员,负责把Java类(.class文件)这个“包裹”从磁盘这个“发货地”送到JVM内部这个“目的地”。类加载器确保每个类只被加载一次,并维护一个类的层级…...
uname -m(machine) 命令用于显示当前系统的机器硬件架构(Unix Name)
文章目录 关于 arm64 架构检查是否安装了 Rosetta 2其他相关信息解释:命令功能:示例: dgqdgqdeMac-mini / % uname -m arm64您运行的 uname -m 命令显示您的系统架构是 arm64。这意味着您的 Mac Mini 使用的是 Apple 的 M1 或更新的芯片&…...
Pgsql:json字段查询与更新
1.查询json字段的值 SELECT attribute_data->>设施类别 mycol, * FROM gis_coord_data WHERE attribute_data->>设施类别阀门井 查询结果如下: 2.更新json字段中的某个属性值 UPDATE gis_coord_data SET attribute_data(attribute_data::jsonb ||{&quo…...
类的加载机制
类加载的概念 类加载是 Java 虚拟机(JVM)把字节码文件(.class 文件)转变为 Java 类型的复杂且关键的过程。这就如同把一份详细的设计图纸(字节码文件)加工成一个可以实际运行和使用的软件模块(J…...
基于vite创建的react18项目的单元测试
题外话 最近一个小伙伴进了字节外包,第一个活就是让他写一个单元测试。 嗯,说实话,在今天之前我只知道一些理论,但是并没有实操过,于是我就试验了一下。 通过查询资料,大拿们基本都说基于vite的项目&…...
fiddler抓包工具与requests库构建自动化报告
一. Fiddler 抓包工具 1.1 Fiddler 工具介绍和安装 Fiddler 是一款功能强大的 HTTP 调试代理工具,能够全面记录并深入检查您的计算机与互联网之间的 HTTP 和 HTTPS 通信数据。其主界面布局清晰,主要包含菜单栏、工具栏、树形标签栏和内容栏。 1.2 Fid…...
Docker login 报证书存储错误的解决办法
文章目录 docker login 出现错误,提示:Error saving credentials: error storing credentials - err: exit status 1, out: Cannot autolaunch D-Bus without X11 $DISPLAY 环境 使用的是 Mint Linux ,容器为 docker-ce 最新版 1 2 3 4 $…...
【自动化Selenium】Python 网页自动化测试脚本(上)
目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 (1)ID定位 &…...
什么是MyBatis?
MyBatis简介 MyBatis是一款优秀的持久层框架,用于简化Java应用程序对数据库的操作。它曾是Apache的一个开源项目,名为iBatis,2010年迁移到Google Code并改名为MyBatis,2013年11月又迁移到了GitHub。 一、MyBatis的作用 在JavaE…...
TortoiseGit 将本地已有仓库推送到远程
TortoiseGit 将本地已有仓库推送到远程 一、创建线上仓库二、创建本地仓库三、提交内容到本地仓库四、添加远程仓库地址补充 一、创建线上仓库 在gitlab管理面页面按这前讲过的步骤创建一个空仓库。(通常我们把服务器上这个仓库叫远程仓库,把我们自己电…...
腾讯云OCR车牌识别实践:从图片上传到车牌识别
在当今智能化和自动化的浪潮中,车牌识别(LPR)技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力,为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…...
TailwindCss 总结
目录 一、简介 二、盒子模型相关 三、将样式类写到一个类里面apply 四、一款TailWind CSS的UI库 一、简介 官方文档:Width - TailwindCSS中文文档 | TailwindCSS中文网 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类…...
Java与C#
Java和C#(C Sharp)是两种流行的面向对象编程语言,它们在很多方面非常相似,因为它们都受到了类似的编程范式和语言设计理念的影响。然而,它们之间也存在一些重要的区别。 平台依赖性: Java:Java是…...
leetcode:222完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最…...
[STM32]从零开始的STM32 FreeRTOS移植教程
一、前言 如果能看到这个教程的话,说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗?是的,我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS,再到最…...
java——Tomcat连接池配置NIO、BIO、APR
Tomcat连接池的配置涉及不同的IO模型,包括NIO(Non-blocking IO,非阻塞IO)、APR(Apache Portable Runtime,Apache可移植运行库)和BIO(Blocking IO,阻塞IO)。以…...
跨域相关的一些问题 ✅
当网页从一个源(https://baidu.com)请求另一个源(如 https://taobao/api)的资源时,就发生了跨域。由于安全原因(防止恶意网站通过脚本访问用户在其他网站上的数据),浏览器对跨域请求…...
RPC学习
一、什么是 RPC RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的子程序或函数,就好像调用本地程序中的函数一样,无需程序…...
coe文件转mif(c语言)
1 mif文件格式 DEPTH=1024; --The size of data in bits WIDTH=16; --The size of memory in words ADDRESS_RADIX = DEC; --The radix for address values DATA_RADIX = UNS...
【leetcode】动态规划
31. 873. 最长的斐波那契子序列的长度 题目: 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n > 3对于所有 i 2 < n,都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr ࿰…...
介绍一下atoi(arr);(c基础)
hi , I am 36 适合对象c语言初学者 atoi(arr);是返回整数(int型),整数是arr数组中字符中数字 格式 #include<stdio.h> atoi(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdlib.h>//atoi(arr); 返 <stdlib> int main(…...
docker入门学习笔记
docker的定义 docker是一个用于构建、运行、传送 应用程序的平台。 为什么要使用docker ? 在开发测试库环境中测试成功后,打包成集装箱,到生产环境也是能够成功的。而传统的安装方式不仅繁琐,并且在测试环境安装后,到…...
使用Python和Pybind11调用C++程序(CMake编译)
目录 一、前言二、安装 pybind11三、编写C示例代码四、结合Pybind11和CMake编译C工程五、Python调用动态库六、参考 一、前言 跨语言调用能对不同计算机语言进行互补,本博客主要介绍如何实现Python调用C语言编写的函数。 实验环境: Linux gnuPython3.10…...
tableau-制作30个图表
制作条形图 步骤: 1、横轴是数值,对应了某一个度量值,纵轴是一个标签 战区的成交额,条形图横轴是战区,纵轴是成交额 下钻条形图 1、增加业务架构-战区右键点击,分层结构,增加分层结构 调整业务架构,将战区,城市,小组移动到业务架构下方 此时的条形图上方有➕号展开后…...
2024APMCM亚太杯数学建模C题【宠物行业】原创论文分享
大家好呀,从发布赛题一直到现在,总算完成了2024 年APMCM亚太地区大学生数学建模竞赛C题的成品论文。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 14 二.问题分析 15 2.1问题一 15 2.2问题二 15 2.3问题三…...
重庆网站建设推广服务/seo学校培训班
PS CC2019更新也有一段时间了,版本升级后,之前的滤镜都不能用了。所以米朵给大家收集整理了10款Photoshop滤镜合集领取方式见文末DR4.5汉化版Delicious Retouch Panel 4.5(简称DR4.5扩展面板)是一款操作简单的Photoshop人像磨皮美…...
教育考试类网站建设/成都专门做网络推广的公司
ORM,即Object-Relation Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。 转载于:h…...
网站开发 方案 报价单/一句简短走心文案
因为我的时间设置貌似已经是"Y-m-d H:i:s",所以时间戳转换无效。 {$vo.create_time|date"Y-m-d H:i:s",###} 需要截取日期。 https://blog.csdn.net/weixin_43674113/article/details/84956607 TP5时间字符串截取 渡目成书 2018-12-11 16:01…...
金华网站建设价格/赣州seo培训
作为开坑专业户,再开个坑,以前在国企时,想专门做渲染,可惜还要看懂引擎,要么没人帮封装。于是进行先学习引擎再学习渲染的路线。 抄写了最低版本的鬼火引擎,osg/osgearth和ogre的大部,osg最长的…...
淄博网站设计/西安百度seo
这道题有个同学先暴力跑答案,然后对答案矩阵观察找规律A掉这题真的厉害Orz 题意 n点完全图,对边黑白染色,要求使得三边颜色相等的三元组最少,输出最少数量和染色方案。 题解 所有的三元组为C3n,假设一开始所有的边…...
网站建设趋势/怎么样推广自己的店铺和产品
要添加将行数计为序列号的新列,可以在select语句中使用global变量。让我们创建一个表。创建表的查询如下:mysql> create table addColumnToCountAsSerialNumber-> (-> Id int,-> Name varchar(20),-> Age int,-> Salary int-> );使…...