数据结构·二叉树(1)

news2024/12/22 11:59:50

目录

1 树的概念及结构

1.1 树的结构

1.2 树的概念

1.3树的表示

2 二叉树的概念及结构

2.1二叉树的概念

2.2 特殊的二叉树

2.3 二叉树的存储结构


1 树的概念及结构

1.1 树的结构

前面所学到的顺序表链表等,都是线性的数据结构,今天介绍的树,是一种非线性的数据结构,因为它看起来像一棵倒挂的树,所以这种结构被称为树。

在树形结构中,树的子集之间是不能有交集的,也就是子集中的交点不能相交。

这种结构不是树,因为子树之间有相交。

1.2 树的概念

以这张图为例:
节点的度:每个节点的子节点数目被称为度,如A的度为6.

叶节点或终端节点:度为0的节点被称为叶节点,也就是终端节点,如B,C, H, I。

非终端节点或分支节点:度不为0的节点被称为非终端节点,如D,E,F G。

双亲节点或父节点:该节点的上一个节点被称为双亲结点,一般为了简易称父节点,如B,C,D,E的父节点都是A。

孩子节点或子节点:同父节点,父节点的孩子的节点被称为子节点,如H是D的子节点。

兄弟节点:父节点相同的两个或多个节点之间被称为兄弟节点,如K,L,M是兄弟节点。

树的度:一棵树的度是所有节点中最大的度,如A的度是6,是所有节点里面最大的,所以树的度为6。

节点的层次:从根开始为第一层,往下一个节点层数加一,一般默认根为第一层(可以从第0层开始)。

树的高度或者深度:层次的最大值就是树的高度。

堂兄弟节点:父节点在同一层的节点是堂兄弟节点,如H 和 I 。

节点的祖先:从该节点的线路一直往上遍历,所有的节点都是该节点的祖先,如A是所有节点的祖先。

子孙:某节点之下的所有子树的节点都是该节点的子孙。

森林:互不相交的n棵树(n >=2)组成的集合叫做森林。

1.3树的表示

树有许多种表示方法,不同于顺序表链表,它常用的表示方法有孩子兄弟表示法

//孩子兄弟表示法
struct Tree
{
	struct Tree* child;
	struct Tree* Brother;
    int val;
};

如上。

树的表示方法有许多种,我们可以根据实际情况进行选取。

树的应用穿插在我们身边,如电脑中的文件,打开一个会有子文件,这就是树的应用。


2 二叉树的概念及结构

2.1二叉树的概念

倘若我们学习节点很多且不确定数量的树,难度是十分大的,所以为了便于理解,我们学习二叉树:
二叉树顾名思义,至多有两个节点的树状结构就是二叉树,同理,N叉树就是节点至多有N个的树状结构。

结合树的概念,我们知道二叉树的子树可以分为左子树和右子树,并且度不能超过2,二叉树实际上就是由空节点,根节点,左子树,右子树,左右子树均存在复合而成的。

2.2 特殊的二叉树

特殊的二叉树分为完全二叉树和满二叉树。

满二叉树:满二叉树除了最后一层的节点度全为0,其余节点的度都是2。

完全二叉树:完全二叉树可以说是特殊的满二叉树,完全二叉树在满二叉树的基础上允许倒数第二层的节点的度不全为0,但是最后一层从左到右的节点必须挨着。

 

2.3 二叉树的存储结构

二叉树存储分为顺序存储和链式存储,这里有个问题:二叉树相对于顺序表和链表的优势在哪里?

实际上,如果我们只是为了存储数据,二叉树的价值是远远不如顺序表和链表的,存储数据多简单,顺序表链表轻松搞定。

二叉树的优势是在于搜索,存储只是一方面,搜索方面二叉树才是强项,如后面介绍的,AVL树,红黑树等。

二叉树的物理结构是数组,逻辑结构是二叉树,真正实现的时候存储数据也是用数组存储的。

所以下一篇介绍的就是二叉树的顺序存储,称为堆,这个堆是数据结构的堆,而不是操作系统的堆。


感谢阅读!

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

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

相关文章

Android Native Crash奔溃

一.Native Crash 简介 从 Android 系统全局来说,Crash 通常分为 App/Framework Crash,Native Crash,以及 Kernel Crash。 对于 App 层或者 Framework 层的 Crash(即 Java 层面 Crash),那么往往是通过抛出未捕获异常而导致的 Cras…

FPGA电平标准

1.LVTTL:(3.3v) 2.LVCOMS:(1.8v) 3.LVDS(1.8v):LVDS_25(2.5v) 4:如果是ddr3与fpga相连接fpga的vcco推荐(1.5v)…

flask_restful的基本使用

优势: Flask-Restful 是一个专门用来写 restful api 的一个插件。 使用它可以快速的集成restful api 接口功能。 在系统的纯api 的后台中,这个插件可以帮助我们节省很多时间。 缺点: 如果在普通的网站中,这个插件就没有优势了&…

【SQL】1517. 查找拥有有效邮箱的用户(正则表达式regexp)

前述 sql-正则表达式SQL学习笔记 – REGEXP 题目描述 leetcode 题目:1517. 查找拥有有效邮箱的用户 Code select * from Users where mail regexp ^[a-zA-Z][a-zA-Z0-9_.-]*leetcode\\.com$图片引用自 MySQL正则表达式

后端常问面经之操作系统

请简要描述线程与进程的关系,区别及优缺点? 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之…

flask_restful规范返回值

使用方法 导入 flask_restful.marshal_with 装饰器 定义一个字典变量来指定需要返回的标准化字段,以及该字段的数据类型 在请求方法中,返回自定义对象的时候, flask_restful 会自动的读 取对象模型上的所有属性。 组装成一个符合标准化参…

定时器 c++ 基于时间线

获取当前时间std::chrono::system_clock::now(); std::chrono::time_point_cast<std::chrono::milliseconds>(now) 是 std::chrono 标准库中的一个函数调用&#xff0c;用于将时间点 now 转换为毫秒级别精度的时间点。 friend class timermanger; 表示将类 timermanger …

数据结构入门学习③——栈和队列

前言&#xff1a; 本篇博客主要介绍有关栈和队列数据结构相关知识 思维导图介绍&#xff1a; 开始之前&#xff0c;先介绍一下这篇博客主要介绍的主体内容&#xff1a; 栈和队列&#xff1a; 回顾线性表&#xff1a; 在刚才的思维导图里我们也了解到了——栈和队列都属于线性…

【vscode打开多文件夹】

1)将文件夹添加到工作空间中 2)文件夹方式展开 3)最终效果 小技巧&#xff1a; 文件夹的位置不对的话&#xff0c;可以拖动进行调整。

3.24作业

基于UDP的网络聊天室 项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器端代码 #in…

数据结构 之 队列习题 力扣oj(附加思路版)

优先级队列 #include<queue> --队列 和 优先级队列的头文件 优先级队列&#xff1a; 堆结构 最大堆 和 最小堆 相关函数&#xff1a; front() 获取第一个元素 back() 获取最后一个元素 push() 放入元素 pop() 弹出第一个元素 size() 计算队列中元素…

<网络>初识计算机网络

目录 一、网络发展 &#xff08;一&#xff09;背景 &#xff08;二&#xff09;类型 二、网络协议 &#xff08;一&#xff09;认识协议 &#xff08;二&#xff09;协议分层 &#xff08;三&#xff09;OSI七层模型 &#xff08;四&#xff09;TCP/IP五层模型 &…

[音视频学习笔记]八、FFMpeg结构体分析 -上一个项目用到的数据结构简单解析:AVFrame、AVFormatContext、AVCodecContext

前言 上次我们做了一个简单的视频解码&#xff0c;MediaPlay-FFmpeg - Public 这一次简单对这个代码进行一个剖析&#xff0c;对其中的数据结构进行一个解析。 这些数据结构之间的关系 AVFrame 、AVFormatContext 、AVCodecContext 、AVIOContext 、AVCodec 、AVStream 、AV…

Pillow教程01:初识Pillow模块(创建Image对象+查看属性+图片的保存与缩放)

--------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁剪…

【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1. 三数之和2. 解法&…

如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言 前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。 今天写另外一篇不需要插件的方式&#xff0c;使用RabbitMQ的死信队列&#xff08;Dead-Letter-Exchanges, DLX&#xff09;和消息TTL&#xff08;Time-To-Live&#xff09;。 这种方法涉及到设置消息…

OpenHarmony 源码解析之SystemUi—Statusbar(TS)

作者&#xff1a;董伟 简介 SystemUI应用是OpenHarmony中预置的系统应用&#xff0c;为用户提供系统相关信息展示及交互界面&#xff0c;包括系统状态、系统提示、系统提醒等&#xff0c;例如系统时间、电量信息。 本文主要分析batterycomponent、clockcomponent、wificompo…

C#自定义控件 生成 与 加入到项目

C#自定义控件生成 在C#中&#xff0c;自定义控件通常是通过继承现有的控件类&#xff08;如UserControl、Form等&#xff09;并添加或修改其属性和方法来实现的。以下是一个简单的示例&#xff0c;演示如何创建一个自定义控件&#xff1a; 首先&#xff0c;创建一个新的Window…

陪诊小程序成品|陪诊系统功能|陪诊小程序研发功能和流程

近年来&#xff0c;随着人们健康意识的提升和医疗行业的不断发展&#xff0c;陪诊小程序在医疗领域中扮演着越来越重要的角色。那么&#xff0c;什么是陪诊小程序&#xff1f;它具有怎样的功能和流程呢&#xff1f;本文将为您详细解读。 陪诊小程序是一种通过手机应用程序进行…

Ipython与Jupyter之间的关系

IPython 和 Jupyter 之间的关系可以从它们的历史和目标中得到很好的解释。IPython&#xff08;Interactive Python&#xff09;最初是由 Fernando Prez 于 2001 年创建的&#xff0c;旨在提升 Python 的交互式计算体验。它提供了一个强大的交互式 Python shell 和一个面向高效计…