【数据结构】树和二叉树的概念及结构(一)

news2024/11/27 14:30:20

目录

一,树的概念及结构

        1,树的定义

        2,树结点的分类及关系

        3,树的表示

二,二叉树的概念及结构

        1,二叉树的定义

        2,特殊的二叉树

        3,二叉树的性质

        4,二叉树的存储结构

1,顺序存储

2,链式储存


一,树的概念及结构

        1,树的定义

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

树(Tree)是n(n>=0)个结点的有限集;

n=0时称为空树;

在任意一颗非空树中:

1,有且仅有一个特定的称为根(Root)的结点;

2,当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,......,Tm,其中每一个集合本身又是一棵树,并且称为跟的子树(SubTree);

如下图所示:

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

        2,树结点的分类及关系

结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为4

叶结点或终端结点:度为0的结点称为叶结点; 如上图:K,G,L,M,N...等结点为叶结点

非终端结点或分支结点:度不为0的结点; 如上图:B,C,E...等结点为分支结点

双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父节点

孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点

兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点

树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为4

结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推

树的高度或深度:树中结点的最大层次; 如上图:树的高度为4

堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为堂兄弟结点

结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先,C是G,H的祖先

子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙,G,H是C的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林

        3,树的表示

        树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法孩子表示法孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

图解:

二,二叉树的概念及结构

        1,二叉树的定义

二叉树(Binary Tree)是n(n>=0) 个结点的有限集合;

该集合或者为空集(称为空二叉树);

或者由一个根结点和两颗互不相交的,分别为根结点的左子树和右子树的二叉树组成;

 图示:

由上图可以看出:

1,二叉树不存在度大于2的结点

2,二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

二叉树具有以下五种基本形态:

        2,特殊的二叉树

1,斜树

所有的结点都只有左子树的二叉树叫左斜树;

所有的结点都只有右子树的二叉树叫右斜树;

斜树图示:

2,满二叉树

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

3,完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树

        3,二叉树的性质

1,若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点

2,若规定根结点的层数为1,则深度为h的二叉树的最大结点数是 2^h-1

3,对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n1 ,则有 n0=n1+1

4,若规定根结点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1) 

5,对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点有:

1,若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

2,若2i+1<n,左孩子序号:2i+1

3,若2i+1>n,右孩子序号:2i+2

        

        4,二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

1,顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

2,链式储存

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系;

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址;

链式结构又分为二叉链和三叉链

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
   struct BinTreeNode* _pLeft; // 指向当前节点左孩子
   struct BinTreeNode* _pRight; // 指向当前节点右孩子
   BTDataType _data; // 当前节点值域
}

// 三叉链
struct BinaryTreeNode
{
   struct BinTreeNode* _pParent; // 指向当前节点的双亲
   struct BinTreeNode* _pLeft; // 指向当前节点左孩子
   struct BinTreeNode* _pRight; // 指向当前节点右孩子
   BTDataType _data; // 当前节点值域
};

第一阶段就到这里了,带大家先了解一下树和二叉树的原理;

后面博主会陆续更新;

如有不足之处欢迎来补充交流!

完结。。。


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

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

相关文章

Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)

文章目录 前言一、Tilling(缩放度)&#xff0c;个人理解有点像减小周期函数的周期的效果&#xff08;在单位空间内&#xff0c;容得下重复的函数图像的多少&#xff09;二、Offset&#xff08;偏移度&#xff09;&#xff0c;个人理解是函数的平移三、在Shader中使用 Tilling 和…

如何批量查询所有德邦快递的物流信息

当我们需要查询多个德邦快递的物流信息时&#xff0c;我们可以使用固乔快递查询助手来批量查询。以下是具体的操作步骤&#xff1a; 1. 在浏览器中搜索并下载【固乔快递查询助手】软件。这款软件支持多种快递公司&#xff0c;包括德邦快递&#xff0c;而且可以批量查询物流信息…

洞发现-APP应用之漏洞探针利用修复(44)

主要分为三个部分&#xff0c;第一部分抓包是很重要的&#xff0c;第二部分是协议&#xff0c;第三部分是逆向&#xff08;讲的不会太多&#xff0c;介绍根据使用不介绍原理&#xff09;&#xff0c; 关于反编译&#xff0c;app就分为安卓和苹果系统&#xff0c;苹果系统的源码…

基于STM32的简易示波器设计

疫情期间闲来无事&#xff0c;正好学习STM32F407&#xff0c;因此设计、制作了简易示波器&#xff0c;以助学习。长话短说方案如下&#xff1a; &#xff08;1&#xff09;单片机&#xff0c;选择STM32F407VET6&#xff0c;采用SWD方式仿真及程序烧写。五路独立按键和两个LED指…

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…

OTFS-ISAC通信最新进展

测试场景 Tx DD域帧结构导频区域 Rx DD域帧导频区域 原始星座图 信道估计及数据检测 经过MP算法后的星座图 误码率曲线

串行协议——USB驱动[基础]

多年前的学习记录&#xff0c;整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…

GB28181学习(二)——注册与注销

概念 使用REGISTER方法进行注册和注销&#xff1b;注册和注销应进行认证&#xff0c;认证方式应支持数字摘要认证方式&#xff0c;高安全级别的宜支持数字证书认证&#xff1b;注册成后&#xff0c;SIP代理在注册过期时间到来之前&#xff0c;应向注册服务器进行刷新注册&…

core dump管理在linux中的前世今生

目录 一、什么是core dump&#xff1f; 二、coredump是怎么来的&#xff1f; 三、怎么限制coredump文件的产生&#xff1f; ulimit 半永久限制 永久限制 四、从源码分析如何对coredump文件的名字和路径管理 命名 管理 一些问题的答案 1、为什么新的ubuntu不能产生c…

ApplicationRunner、InitializingBean、@PostConstruct 执行顺序

概述 开发中可能会有这样的场景&#xff0c;需要在容器启动的时候执行一些内容。比如读取配置文件&#xff0c;数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。两个启动加载接口分别是&#xff1a;CommandLineRunner和ApplicationRunner。Spring 提…

【高阶数据结构】红黑树 {概念及性质;红黑树节点的定义;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树&#xff0c;在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有…

【多线程案例】生产者消费者模型(堵塞队列)

文章目录 1. 什么是堵塞队列&#xff1f;2. 堵塞队列的方法3. 生产者消费者模型4. 自己实现堵塞队列 1. 什么是堵塞队列&#xff1f; 堵塞队列也是队列&#xff0c;故遵循先进先出的原则。但堵塞队列是一种线程安全的数据结构&#xff0c;可以避免线程安全问题&#xff0c;当队…

数学建模--时间序列预测模型的七种经典算法的Python实现

目录 1.开篇版权提示 2.时间序列介绍 3.项目数据处理 4.项目数据划分可视化 5.时间预测序列经典算法1&#xff1a;朴素法 6.时间预测序列经典算法2&#xff1a; 简单平均法 7.时间预测序列经典算法3&#xff1a;移动平均法 8.时间预测序列经典算法4&#xff1a;简单指…

pytest自动化测试两种执行环境切换的解决方案

目录 一、痛点分析 方法一&#xff1a;Hook方法pytest_addoption注册命令行参数 1、Hook方法注解 2、使用方法 方法二&#xff1a;使用插件pytest-base-url进行命令行传参 一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&am…

windows-nessus安装

1、下载 路径&#xff1a;Download Tenable Nessus | Tenable 2、获取active code 路径&#xff1a;Tenable Nessus Essentials Vulnerability Scanner | Tenable 3、安装 challenge code:上图马赛克位置 active code:获取active code第二张图片的马赛克位置 4、激活 5、安装…

Docker从认识到实践再到底层原理(三)|Docker在Centos7环境下的安装和配置

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

企业架构LNMP学习笔记10

1、Nginx版本&#xff0c;在实际的业务场景中&#xff0c;需要使用软件新版本的功能、特性。就需要对原有软件进行升级或重装系统。 Nginx的版本需要升级迭代。那么如何进行升级呢&#xff1f;线上服务器如何升级&#xff0c;我们选择稳定版本。 从nginx的1.14版本升级到ngin…

【数据库】MySQL基础知识全解

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于拓跋阿秀、小林coding等大佬博客进行的&#xff0c;每个知识点的修…

计算机的存储规则(ASCII,GBK,Unicode)

不爱生姜不吃醋⭐️⭐️⭐️ 声明&#xff1a; &#x1f33b;本文写的是关于计算机的存储规则 ❗️ &#x1f33b;看完之后觉得不错的话麻烦动动小手点个赞赞吧&#x1f44d; &#x1f33b;如果本文有什么错误的话欢迎在评论区中指正哦&#x1f497; &#x1f33b;与其明天开始…

count(1)与count(*)的区别、ROUND函数

部分问题 1. count(1)与count(*)的区别2. ROUND函数3. SQL19 分组过滤练习题4. Mysql bigdecimal 与 float的区别5. 隐式内连接与显示内连接 &#xff08;INNER可省略&#xff09; 1. count(1)与count(*)的区别 COUNT(*)和COUNT(1)有什么区别&#xff1f; count(*)包括了所有…