二叉树数据结构:深入了解二叉树的概念、特性与结构

在探索栈和队列之后(大家可以移步至我的数据结构专栏):T-rLN的数据结构专栏

我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界,从最基本的概念和结构开始,逐步深入了解二叉树的顺序结构和链式结构


文章目录

  • 1.树概念和结构
    • 1.1树的概念
    • 1.2树的相关概念
    • 1.3树的表示
    • 1.4树的实际应用
  • 2.二叉树概念和结构
    • 2.1二叉树的概念
    • 2.2两种特殊二叉树
    • 2.3二叉树的性质
    • 2.5二叉树的储存结构


1.树概念和结构

1.1树的概念

请添加图片描述

树是一种抽象数据类型(ADT)非线性的数据结构,它由节点组成的集合构成,节点间通过边连接

它的命名灵感来源于现实生活中的树木结构。类似于自然界中树木的结构,树这一数据结构的视觉表示也呈现出分支延伸的形态,由根部向外延伸出分支,这种分支的结构特点赋予了数据结构树这一名称(一个倒挂的树)

  • 树中有一个特殊的节点,称为根节点,它位于树的顶部没有父节点(前驱节点)
  • 树中除根节点外,其他节点都被分成了若干个互不相交的集合,每个集合又形成了一棵类似于树的子树。这里的每个子树都类似于整体的树结构,它们都有一个根节点,这个根节点在当前子树中有且只有一个前驱节点(即父节点),但可以有零个或多个后继节点(子节点)
  • 这种定义描述了树这种数据结构的递归性质

请添加图片描述

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

请添加图片描述

这些都不是树。 树的要求:

  • 子树不能相交
  • 除了根节点以外,其余节点只有一个父节点
  • 一个有哦X个节点的树,边的数量是X-1(梦回离散数学)

1.2树的相关概念

请添加图片描述

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

叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、D、H、I…等节点为叶节点

非终端节点/分支节点:度不为0的节点; 如上图:C、E、G…等节点为分支节点

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

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

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

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

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推(也有把跟视为第0层的);

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

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

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

森林多棵互不相交的树的集合称为森林

1.3树的表示

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

  1. 双亲表示法:在每个节点中存储一个指向其父节点的指针或索引
typedef struct {int data; // 节点数据PTNode* parent; // 指向父节点的指针或索引
} PTNode;typedef struct {PTNode* nodes; // 存储所有节点的数组(要动态的)int n; // 树中当前节点数
} PTree;
  1. 孩子表示法:每个节点保存一个指向其第一个子节点的指针
  2. 孩子兄弟表示法(也叫作左孩子右兄弟表示法):每个节点有指向其第一个孩子的指针和指向其右兄弟的指针
typedef struct CSNode {int data; // 节点数据struct CSNode* firstChild; // 指向第一个子节点的指针struct CSNode* nextSibling; // 指向右兄弟节点的指针
} CSNode;

1.4树的实际应用

在 Linux 文件系统中,树形结构是文件和目录组织的基础。文件系统以树的形式组织文件和目录,根目录是整个文件系统的顶层,所有的文件和目录都从根目录开始分支。每个目录(包括根目录)都可以包含文件和其他目录

请添加图片描述


2.二叉树概念和结构

2.1二叉树的概念

二叉树是一种重要的树形数据结构,它由节点构成,每个节点最多有两个子节点(不是必须两个),分别称为左子节点和右子节点。这两个子节点通常称为左子树和右子树

请添加图片描述

从上图可看出:

  • 二叉树不存在度大于2的结点
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.2两种特殊二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。换句话说,在满二叉树中每个节点都有两个子节点
  2. 完全二叉树:是一种特殊的二叉树,在一棵二叉树中,如果除了最底层,其他层的节点都是满的,并且最底层的节点都从左至右依次填满,这样的树被称为完全二叉树

满二叉树是一种特殊的完全二叉树

请添加图片描述

2.3二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第n层上最多有 2 n − 1 2^{n-1} 2n1个结点(第一层 2 0 2^0 20,第二层 2 1 2^1 21);
  2. 若规定根节点的层数为1,则**深度为h的二叉树的最大结点数(节点总数)**是: 2 h − 1 2^h-1 2h1
  • 第一层(根节点层)有 1 个节点。
  • 第二层有最多 2 个节点。
  • 第三层有最多 4 个节点。
  • 第 ℎ 层有最多 2 h − 1 2^{h-1} 2h1个节点。

​ 所以,前 ℎh 层的节点数之和为 1+2+4+…+ 2 h − 1 2^{h-1} 2h1= 2 h − 1 2^{h}-1 2h1

  1. 若规定根节点的层数为1,具有n个结点的满二叉树的深度(h): l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)

请添加图片描述

  1. 对于具有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否则无右孩子

2.5二叉树的储存结构

  1. 顺序储存(数组):顺序结构存储就是使用数组来存储,一般数组只适合表示完全二叉树,因为不是完全二叉树空间的浪费比较大。而现实中使用中只有才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上(把它想象成,把它看作是)是一颗二叉树
  2. 链式储存(链表):二叉树的链式存储结构是指,用链表来表示一棵二叉树。通常的方法是链表中每个结点由三个域组成,数据域、左指针域和右指针域。左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址,数据域就存储数据

这次就到这里啦,下一次大概率是二叉树的顺序结构和堆的相关内容,感谢大家的支持!

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

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

相关文章

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

hyper-v ubuntu 3节点 k8s集群搭建

前奏 搭建一主二从的k8s集群&#xff0c;如图所示&#xff0c;准备3台虚拟机。 不会创建的同学&#xff0c;可以看我上上篇博客&#xff1a;https://blog.csdn.net/dawnto/article/details/135086252 和上篇博客&#xff1a;https://blog.csdn.net/dawnto/article/details/135…

(04730)半导体器件之基本放大器工作原理(三)

本文主要阐述多级与差动放大器 为使输入的微弱信号进行放大后能获得足够的输出功率去推动负载运行&#xff0c;往往要采用所谓的多级放大电路&#xff0c;信号逐级通过放大&#xff0c;直至得到输出信号。这就必须考虑放大电路级与级之间的信号传递方法&#xff0c;或者称为耦…

微软官方系统镜像安装U盘制作

https://www.microsoft.com/zh-cn/software-download/windows11https://www.microsoft.com/zh-cn/software-download/windows10工具下载地址 #win10 https://download.microsoft.com/download/b/0/5/b053c6bc-fc07-4785-a66a-63c5aeb715a9/MediaCreationTool21H2.exehttps://d…

GC控制器(Garbagecollector)源码解析

KubeController Garbagecollector 本文从源码的角度分析KubeController Garbagecollector相关功能的实现。 本篇kubernetes版本为v1.27.3。 kubernetes项目地址: https://github.com/kubernetes/kubernetes controller命令main入口: cmd/kube-controller-manager/controller-…

k8s的网络类型

部署 CNI 网络组件 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命名空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localho…

internet download manager 6.42怎么删除卸载,2024最新idm卸载不干净怎么解决

internet download manager 6.42简称为IDM&#xff0c;这是一款非常好用的下载软件&#xff0c;很多小伙伴都在使用。如果后续我们不再需要使用该软件&#xff0c;小伙伴们知道具体该如何将其卸载掉吗&#xff0c;其实卸载方法是非常简单的&#xff0c;只需要进行几个非常简单的…

Qt+Opencv:模板匹配

一、模板匹配应用场景闲聊 在很多机器视觉的应用场景都有用到模板匹配的功能&#xff0c;常常用来判断是否有目标检测对象&#xff0c;以及检测对象在图像中的位置。譬如在AOI检测软件中&#xff0c;通过拍摄Mark点的图像&#xff0c;进行mark模板的匹配&#xff0c;从而进行晶…

【Java EE初阶三 】线程的状态与安全(上)

1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率&#xff0c;因此就引入了多个线程的概念&#xff1b;即每个线程负责完成整个程序的一部分工作即可。 写一个代码&#xff0c;让主线程&#xff0c;创建一个新的线程&#xff0c;由新线程负责完成运算&#xff08;12。…

数模学习day01-层次分析法模型

已经一个多月没有更新过文章了&#xff0c;为了保住那绩点的意思微弱的优势&#xff0c;直接开摆&#xff0c;开始复习专业课和公共课考试了&#xff0c;结果虽然有遗憾但是还是算不错&#xff0c;至少没有掉到3.xx嘿嘿。 然后现在就要开始学习数学建模和算法同步了。接下来的文…

element ui Checkbox 多选框组件 lable不支持Object类型的值的问题

浅浅记录一下&#xff0c;遇到这个问题的心理路程吧&#xff0c;首先我遇到的问题是多选框的值回显不打对勾&#xff0c;&#xff08;例如&#xff1a;你新增的时候多选&#xff0c;然后点击编辑的时候选过的值没有被勾选&#xff0c;其实是被勾选上了&#xff0c;但是没有显示…

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…

Zulip:开源团队协作工具,高效沟通与远程办公 | 开源日报 No.126

zulip/zulip Stars: 18.9k License: Apache-2.0 Zulip 是一个开源的团队协作工具&#xff0c;拥有独特的基于主题的线程功能&#xff0c;结合了电子邮件和聊天的优点&#xff0c;使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。 其核心优势…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

RabbitMq知识概述

本文来说下RabbitMq相关的知识与概念 文章目录 概述AMQP协议Exchange 消息如何保证100&#xff05;投递什么是生产端的可靠性投递可靠性投递保障方案 消息幂等性高并发的情况下如何避免消息重复消费confirm 确认消息、Return返回消息如何实现confirm确认消息return消息机制 消费…

《数据库开发实践》之存储过程【知识点罗列+例题演练】

一、什么是存储过程&#xff1f; 1.概念理解&#xff1a; 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句&#xff0c;提供一种封装任务的方法。因此在创建编译好某个存储过程后&#xff0c;因为存储过程中有可执行操作的sql语句&#xff0c;用户可以…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

【机组期末速成】计算机的运算方法|进制转换|无符号数与有符号数|数的定点表示与浮点表示|定点运算

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、日常我们采用十进制来表示数据&#xff0c;计算机如何表示&#xf…

PolarNet: 一种改进的时实激光雷达点云语义分割网格表示方法

PolarNet介绍 github工程代码&#xff1a;https://github.com/edwardzhou130/PolarSeg 点云语义分割在自动驾驶领域的感知模块占据重要地位, 从多年前基于传统的点云聚类和分割,到近些年基于深度学习的点云语义分割方法, 技术逐渐成熟已经进入实时端到端的阶段. 前有基于球面…

无魔搭+ 函数计算: 一键部署,缩短大模型选型到生产的距离

引言 面对魔搭 ModelScope 社区提供的海量模型&#xff0c;用户希望快速进行选型并生产使用起来&#xff0c;但在此之前&#xff0c;却一定会面临算力管理难、模型部署难等一系列问题&#xff0c;那么能否实现快速把选定的模型部署在云端功能强大的 GPU 上&#xff0c;由云端负…