当前位置: 首页 > news >正文

【数据结构】树和二叉树

一、树的概念及结构

1、树的概念

是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
  • 有一个特殊的结点,称为根结点,根节点没有前驱结点。
  • 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合 Ti (1<= i <= m) 又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
  • 因此,树是递归定义的

现实生活中的树:                                                ​​​​​​​数据结构中的树:

注意树形结构中,子树之间不能有交集,否则就不是树形结构。


2、树的相关概念

  • 节点的一个节点含有的子树的个数称为该节点的度; 如上图:A 的度为 6。
  • 叶节点或终端节点度为 0 的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点。
  • 非终端节点或分支节点度不为 0 的节点; 如上图:D、E、F、G...等节点为分支节点。
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A 是 B 的父节点。
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点。
  • 兄弟节点具有相同父节点的节点互称为兄弟节点; 如上图:B、C 是兄弟节点。
  • 树的度一棵树中,最大的节点的度称为树的度; 如上图:树的度为 6。
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第 2 层,以此类推。
  • 树的高度或深度树中节点的最大层次; 如上图:树的高度为 4。
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点。
  • 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A 是所有节点的祖先。
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙。
  • 森林:由m(m>0)棵互不相交的树的集合称为森林。

3、树的表示

树结构相对线性表比较复杂,要存储表示起来就比较麻烦。既然保存值域,也要保存结点和结点之间 的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法
// 孩子兄弟表示法
typedef int DataType;
struct Node
{struct Node* firstChild1; // 第一个孩子结点struct Node* pNextBrother; // 指向其下一个兄弟结点DataType data; // 结点中的数据域
};


4、树在实际中的运用(表示文件系统的目录树结构)


二、二叉树的概念及结构

1、概念

一棵二叉树是结点的一个有限集合,该集合:
  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

从上图可以看出:
  1. 二叉树不存在度大于 2 的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:

2、现实生活中的二叉树


3、特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 K结点总数是 2^K-1,则它就是满二叉树。

  2. 完全二叉树完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 K 的满二叉树中编号从 1 至 n 的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树前 K 层都是满的,最后一层不一定满,但最后一层从左到右必须是连续的。深度为 K 的完全二叉树的节点个数最多为 2^K - 1最少为 2^(K-1) - 1 + 1(前 K 层结点个数总和 +1,因为第 K 层至少有一个结点),所以节点个数范围是:[ 2K-1, 2K - 1 ]


4、二叉树的性质 

  1. 若规定根节点的层数为 1,则一棵非空二叉树的第 i 层最多有 2^(i-1) 个结点
  2. 若规定根节点的层数为 1,则深度为 h 二叉树的最大结点数是 2^h-1
  3. 对任何一棵二叉树, 如果度为 0 其叶结点个数为 n , 度为 2 的分支结点个数为 m ,则有 n= m+1
  4. 若规定根节点的层数为 1,具有 n 个结点的满二叉树的深度h= log(n+1). (ps:log(n+1)是 log 以 2 为底,n+1 为对数)。
  5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对于序号为 i 的结点有: ​​​​​​​​​​​​​​

 

  • 若 i>0i 位置节点的双亲序号:(i-1)/2;i=0,i 为根节点编号,无双亲节点。
  • 若 2i+1<n,左孩子序号:2i+1,2i+1>=n 否则无左孩子。
  • 若 2i+2<n,右孩子序号:2i+2,2i+2>=n 否则无右孩子。

5、二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构
(1)顺序存储
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树。因为不是完全二叉树会有空间的浪费。而现实中使用中只有才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
  • leftchild = parent * 2 + 1

  • rightchild = parent * 2 + 2

  • parent = (child - 1) / 2


(2)链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。目前我们一般用到的都是二叉链。( 后面的 数据结构内容如红黑树等会用到三叉链)

 

typedef int BTDataType;// 二叉链
struct BinaryTreeNode
{struct BinaryTreeNode* left; // 指向当前节点左孩子struct BinaryTreeNode* right; // 指向当前节点右孩子BTDataType data; // 当前节点值域
}// 三叉链
struct BinaryTreeNode
{struct BinaryTreeNode* parent; // 指向当前节点的双亲struct BinaryTreeNode* left; // 指向当前节点左孩子struct BinaryTreeNode* right; // 指向当前节点右孩子BTDataType data; // 当前节点值域
};

相关文章:

【数据结构】树和二叉树

一、树的概念及结构 1、树的概念 树 是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&a…...

GPIO 配置 和 PINCTRL有啥区别

GPIO&#xff08;通用输入/输出&#xff09;和 PINCTRL&#xff08;引脚控制器&#xff09;是在嵌入式系统中用于管理和控制硬件引脚的关键概念。它们在硬件层面上起着不同的作用。 GPIO配置&#xff1a; GPIO 是一种通用的硬件接口&#xff0c;用于控制和读取数字信号。每个 …...

GPT法律领域

法律领域 LaWGPT Github: https://github.com/pengxiao-song/LaWGPT 简介&#xff1a;基于中文法律知识的大语言模型。 数据&#xff1a;基于中文裁判文书网公开法律文书数据、司法考试数据等数据集展开&#xff0c;利用Stanford_alpaca、self-instruct方式生成对话问答数据…...

【C++11保姆级教程】Type aliases(类型别名)、alignof and alignas(类型对齐))

文章目录 前言一、类型别名&#xff08;Type aliases&#xff09;1.1类型别名是什么&#xff1f;1.2使用方法1.3实际使用1.4优势 二、类型对齐&#xff08;alignof and alignas&#xff09;2.1类型对齐的概念2.2类型对齐快速理解2.3具体使用2.4示例代码 总结 前言 在C11标准中…...

地址解析协议-ARP

ARP协议 无论网络层使用何种协议&#xff0c;在实际网络的链路上传输数据帧时&#xff0c;最终必须使用硬件地址 地址解析协议&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff1a;完成IP地址到MAC地址的映射&#xff0c;每个主机都有一个ARP高速缓…...

Java线程

文章目录 一、Thread类1.1创建线程1.2Thread类中的一些构造方法1.3Thread类中的一些属性1.4线程的终止/打断1.5线程等待1.6获取当前线程的引用1.7休眠当前线程 二、线程的状态 一、Thread类 线程是操作系统的概念&#xff0c;操作系统内核实现了线程这样的机制&#xff0c;系统…...

C语言如何实现DES加密与解密

C语言实现DES加密解密 #include "des.h" //移位表 static Table_size const shiftTable[NumberOfKeys] {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; //E扩展表 static Table_size const eTable[des_key_pc2_standard]{32, 1, 2, 3, 4, 5, 4, 5, 6, …...

【笔记】优先队列(priority_queue/set)

目录 大根堆 小根堆 set&#xff08;小根堆&#xff09; 大根堆 题目链接&#xff1a;洛谷 P3243 菜肴制作 题目描述 知名美食家小 A 被邀请至 ATM 大酒店&#xff0c;为其品评菜肴。ATM 酒店为小 A 准备了 n 道菜肴&#xff0c;酒店按照为菜肴预估的质量从高到低给予 1 到…...

看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…...

Linux进阶之Shell-sed

基本用法&#xff1a; sed 选项 “指令” 文件 常用选项&#xff1a; -e   --它告诉sed将下一个参数解释为一个sed指令&#xff0c;只有当命令行上给出多个sed指令时使用 -f   --后跟保存了sed指令的文件 -i   --直接对内容进行修改&#xff0c;不加 i 时默认只是预…...

前端高频面试题 Day02

面试题 var 和 let const 的区别 var 是 ES5 及之前的语法&#xff0c;let const 是 ES6 语法var 和 let 是变量&#xff0c;可修改&#xff1b;const 是常量&#xff0c;不可修改var 有变量提升&#xff0c;let const 没有var 没有块级作用域&#xff0c;let const 有 &…...

MYSQL完全卸载、安装与账号创建、权限控制

一、卸载mysql CentOS 卸载 MySQL 1. 查看安装情况 使用以下命令查看当前安装mysql情况&#xff0c;查找以前是否装有mysql rpm -qa|grep -i mysql这里显示我安装的 MySQL 服务有有&#xff1a; 2. 停止 mysql 服务、删除之前安装的 mysql 删除命令&#xff1a;rpm -e –n…...

get与post如何拼接url与数据的灵活处理,循环的重要性。

get与post拼接url地址不同&#xff1a; let postData {method: "post",data: {op: "/api/setting/maintenanceperiod?period"this.authorizationCode,loadingConfig: {},data: {period:this.authorizationCode}}}; if(this.editData.id){let postData …...

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现 注1&#xff1a;本文系“无线感知论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI…...

Android学习之路(5) UI控件之Button (按钮)与 ImageButton (图像按钮)

本节引言&#xff1a; 今天给大家介绍的Android基本控件中的两个按钮控件&#xff0c;Button普通按钮和ImageButton图像按钮&#xff1b; 其实ImageButton和Button的用法基本类似&#xff0c;至于与图片相关的则和后面ImageView相同&#xff0c;所以本节 只对Button进行讲解&am…...

Day 31 C++ STL常用算法(下)

文章目录 常用拷贝和替换算法copy——容器内指定范围的元素拷贝到另一容器中函数原型注意——利用copy算法在拷贝时&#xff0c;目标容器要提前开辟空间示例 replace——将容器内指定范围的第一个旧元素修改为新元素函数原型注意——replace只会替换区间内满足条件的第一个旧元…...

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…...

IDEA下方工具栏SideBar没有Services解决方法 IDEA配合微服务学习多端口管理打开Services栏方法

问题 微服务学习时&#xff0c;一次要打开多个端口&#xff0c;比如8080给order模块、8081给user模块……这就需要用idea管理多端口。 这时候就可以用到Services栏进行管理。 解决 首先看下方Sidebar没有Services。 打开Services 打开方式一&#xff1a;手动打开 在IDEA中…...

[Vue warn]: Error in render: “SyntaxError: “undefined“ is not valid JSON“

[Vue warn]: Error in render: “SyntaxError: “undefined” is not valid JSON” 这说明出现了undefined这个变量类型&#xff0c;比如JSON.parse()时候会出现&#xff0c;可以先尝试打印JSON.parse()括号中的内容是否是undefined&#xff0c;如果是&#xff0c;那问题的根源…...

ui设计师工作总结及计划范文模板

ui设计师工作总结及计划范文模板【篇一】 白驹过隙&#xff0c;转眼间某某年已近结尾&#xff0c;时间伴随着我们的脚步急驰而去&#xff0c;到了个人工作总结的时候&#xff0c;蓦然回首&#xff0c;才发现过去的一年不还能画上圆满的句号&#xff0c;内心感慨万千&#xff0c…...

【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端

目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前&#xff0c;需要先做点准备工作&#xff0c;用 IDEA 新建一个 Maven 项目&#xff0c;取名 kafka-study&#xff0c;然后删掉它的 src 目录&#xff0c;接着在 pom.xml 里面引入下面的依赖。这个项目的作…...

使用腾讯云轻量服务器Matomo应用模板建网站流量统计系统

腾讯云百科分享使用腾讯云轻量应用服务器Matomo应用模板搭建网站流量统计系统&#xff0c;Matomo 是一款开源的网站数据统计软件&#xff0c;可以用于跟踪、分析您的网站的流量&#xff0c;同时充分保障数据安全性、隐私性。该镜像基于 CentOS 7.6 64位操作系统&#xff0c;已预…...

clickhouse-监控配置

一、概述 监控是运维的一大利器&#xff0c;要想运维好clickhouse,首先就要对其进行监控&#xff0c;clickhouse有几种监控数据的方式&#xff0c;一种是系统本身监控&#xff0c;一种是通过exporter来监控&#xff0c;下面分别描述一下 二、系统自带监控 我下面会对监控做一…...

C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解

C11并发与多线程笔记&#xff08;5&#xff09;互斥量概念、用法、死锁演示及解决详解 1、互斥量&#xff08;mutex&#xff09;的基本概念2、互斥量的用法2.1 lock()&#xff0c;unlock()2.2 lock_guard类模板 3、死锁3.1 死锁演示3.2 死锁的一般解决方案&#xff1a;3.3 std:…...

华为云classroom赋能--Devstar使应用开发无需从零开始

华为云DevStar为开发者提供业界主流框架代码初始化能力&#xff0c;通过GUI、API、CLI等多种方式&#xff0c;将按模板生成框架代码的能力推送至用户桌面。同时基于华为云服务资源、成熟的DevOps开发工具链和面向多场景的众多开发模板&#xff0c;提供一站式创建代码仓、自动生…...

软件的数据回滚

原理&#xff1a;所谓的数据回滚&#xff0c;就是数据备份 增量备份&#xff1a; 全量备份&#xff1a; 最简单的事全量备份。 就是spoon工具&#xff0c;完成把所有的表每天定时复制一份&#xff0c;表名“_日期”。 所以有实时表&#xff0c;每日备份表。 回滚就是把之前…...

git clone使用https协议报错OpenSSL SSL_read: Connection was reset, errno 10054

在使用git 下载github上的代码时&#xff0c; 一般有ssh协议和https协议两种。使用ssh协议可以成功clone代码&#xff0c; 但使用https协议时出错&#xff1a; $ git clone https://github.com/openai/improved-diffusion.git Cloning into improved-diffusion... fatal: unab…...

化繁为简,使用Hibernate Validator实现参数校验

前言 在之前的悦享校园的开发中使用了SSM框架&#xff0c;由于当时并没有使用参数参数校验工具&#xff0c;方法的入参判断使用了大量的if else语句&#xff0c;代码十分臃肿&#xff0c;因此最近在重构代码时&#xff0c;将框架改为SpringBoot后&#xff0c;引入了Hibernate V…...

【Qt】多线程

线程创建 自定义线程类 #ifndef CUSTOMETHREAD_H #define CUSTOMETHREAD_H#include <QObject> #include <QThread> #include "add.h"class CustomeThread : public QThread {Q_OBJECT public:// Bind the thread kernel function.explicit CustomeThre…...

腾讯云GPU服务器GN7实例NVIDIA T4 GPU卡

腾讯云GPU服务器GN7实例搭载1颗 NVIDIA T4 GPU&#xff0c;8核32G配置&#xff0c;系统盘为100G 高性能云硬盘&#xff0c;自带5M公网带宽&#xff0c;系统镜像可选Linux和Windows&#xff0c;地域可选广州/上海/北京/新加坡/南京/重庆/成都/首尔/中国香港/德国/东京/曼谷/硅谷…...