数据结构——认识二叉树

这是一篇回顾二叉树概念的文章

  • 前言:
  • 一、了解树形结构
    • 1.2 树的定义
    • 2.2 树的相关概念
    • 2.2 树的表示形式
  • 二、了解二叉树结构和性质
    • 2.1 什么是二叉树?
    • 2.2 二叉树的性质
    • 2.3 二叉树的遍历
    • 2.3 二叉树的应用范围
    • 2.5 二叉树的优缺点
  • 三、掌握二叉树的存储结构
    • 3.1 二叉树的顺序结构存储
    • 3.2 二叉树的链式结构存储

前言:

一、了解树形结构

1.2 树的定义

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

在这里插入图片描述

它具有以下的特点:

  • 有一个特殊的结点,称为根结点,根结点没有前驱结点。
  • 除根结点外,其余结点被分成M(M >0)个互不相交的集合T1、T2、…、Tm,其中每一个集合Ti (1 <= i <= m)又是一棵与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。
  • 树是递归定义的。

注意:
树形结构中,子树不能有交集,否则不是树形结构。
除了根节点以外,每个节点只能有一个前驱,可以有0个或多个后继。

2.2 树的相关概念

  1. 叶子结点或终端结点:度为0的结点称为叶结点。
  2. 非终端结点或分支结点:度不为0的结点。
  3. 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点。
  4. 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点。
  5. 根结点:一棵树中,没有双亲结点的结点。
  6. 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推
  7. 树的高度或深度:树中结点的最大层次。
  8. 结点的祖先:从根到该结点所经分支上的所有结点。
  9. 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。

下面的概念并不是十分重要,了解即可:

  1. 结点的度:一个结点含有子树的个数称为该结点的度。
  2. 树的度:一棵树中,结点的度的最大称为树的度。
  3. 兄弟结点:具有相同父结点的结点互称为兄弟结点。
  4. 堂兄弟结点:双亲在同一层的结点互为堂兄弟。
  5. 有序树:树中节点的各棵子树T0、T1……都是有序得。
  6. 无序树:树中节点的各棵子树之间的次序是不重要得,可以互相交换位置。
  7. 森林:由m(m>=0)棵互不相交的树组成的集合称为森林

2.2 树的表示形式

树有很多种表示方式,如
双亲表示法, 孩子表示法 、 孩子双亲表示法 、孩子兄弟表示法等等。

孩子兄弟表示法:

class Node {
int value ; // 树中存储的数据
Node fifirstChild ; // 第一个孩子引用
Node nextBrother ; // 下一个兄弟引用
}

二、了解二叉树结构和性质

2.1 什么是二叉树?

二叉树是一种数据结构,由节点组成,每个节点最多有两个子节点,分别为左子节点和右子节点。树的最上面的节点称为根节点,没有子节点的节点称为叶子节点。每个非叶子节点都有一个值,称为该节点的数据或关键字。

一个典型的二叉树节点包含以下属性:

  • 数据/关键字
  • 左子节点的指针/引用
  • 右子节点的指针/引用

满二叉树 : 一棵二叉树,如果 每层的结点数都达到最大值,则这棵二叉树就是满二叉树 。也就是说, 如果一棵 二叉树的层数为 K ,且结点总数是 2^k-1 ,则它就是满二叉树 。
完全二叉树 : 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为K 的满二叉树中编号从 0 至 n-1 的结点一一对应时称之为完全二叉树。

2.2 二叉树的性质

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) (i>0)个结点。
  2. 若规定根结点的层数为1,则深度为K的二叉树的最大结点数是2^k-1(一共有多少个结点)
  3. 对任何一棵二叉树, 如果其叶子结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1(度为0的比度为2的永远多一个)
  4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度,h=long2(n+1)(2为底,n+1为指数)
  5. 对具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则有:
    通过下标任意位置可以找孩子和父亲
    在这里插入图片描述

2.3 二叉树的遍历

前序遍历(Preorder Traversal):

  • 访问根节点
  • 前序遍历左子树
  • 前序遍历右子树

2. 中序遍历(Inorder Traversal):

  • 中序遍历左子树
  • 访问根节点
  • 中序遍历右子树

3. 后序遍历(Postorder Traversal):

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根节点

2.3 二叉树的应用范围

  1. 数据库系统: 二叉树结构在数据库系统中常用于索引结构,例如二叉搜索树。
  2. 表达式树:用于表示数学表达式,其中每个操作符是树的一个节点,操作数是它的子节点。
  3. 文件系统:文件系统中的目录结构通常可以用树来表示,例如Unix文件系统。
  4. 编译器设计:语法树(语法分析树)是编译器中用于表示源代码结构的一种二叉树。
  5. 网络路由算法: 用于构建路由表,支持高效的数据包转发。

2.5 二叉树的优缺点

优点:
高效的搜索: 二叉树的结构使得搜索操作非常高效,因为每个节点都最多有两个子节点,可以通过比较大小迅速确定搜索方向。
易于排序: 二叉搜索树(BST)的一种形式,能够在插入和删除操作中维护排序。
缺点:
不平衡可能性: 在某些情况下,二叉树可能会退化为链表,导致操作的时间复杂度变为O(n)。
对于特定类型的数据集,性能可能下降: 当数据集合中的数据顺序有序时,二叉树的性能可能变差,因为它将导致树的不平衡。

三、掌握二叉树的存储结构

二叉树的存储结构可以分为两大类:

  • 顺序结构存储
  • 链式结构存储

3.1 二叉树的顺序结构存储

二叉树的顺序存储对二叉树是有一定要求的,普通的二叉树不适合使用顺序存储,会造成空间上的浪费。(二叉树顺序存储,在物理上是一个数组,在逻辑上是一颗二叉树)
如图:
在这里插入图片描述

只有完全二叉树才可以使用顺序存储
如图:
在这里插入图片描述

3.2 二叉树的链式结构存储

二叉树的链式存储结构,顾名思义就是使用链表来表示二叉树,使用链表来表示二叉树的结构,通常是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NX二次开发常用函数:UF_MODL_ask_feat_......(二)

最近学习NX二次开发发现有一些函数经常使用&#xff0c;俗话说得好&#xff0c;好记性不如烂笔头&#xff0c;现在做一下笔记&#xff0c;帮助理解。 UF_MODL_ask_feat_......在头文件uf_modl.h中 1、UF_MODL_ask_feat_direction &#xff08;查询特征的方向&#xff09; 概…

Java基于微信小程序的校园订餐小程序的实现,附源码和数据库

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

TypeScript类型缩小

类型缩小的概念 前面我们写了一些这样的代码&#xff1a; function padLeft(padding: number | string, input: string): string {if (typeof padding number) {return .repeat(padding) input}return padding input }没有if判断时&#xff0c;无法执行语句return ’ .re…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

Qt读取本地系统时间的几种方式

一&#xff0c;使用Windows API函数GetLocalTime&#xff08;精确到毫秒&#xff09; typedef struct _SYSTEMTIME //SYSTEMTIME结构体定义 {   WORD wYear;//年   WORD wMonth;//月   WORD wDayOfWeek;//星期&#xff0c;0为星期日&#xff0c;1为星期一&#xff0c…

深入理解Java中的Reader类

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【JAVA】通过JAVA实现用户界面的登录

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

宋仕强说金航标kinghelm萨科微slkor都是网红品牌

宋仕强说金航标kinghelm萨科微slkor都是网红品牌&#xff0c;和宋仕强先生研究的“华强北”大ip一起&#xff0c;相互支持相互驱动&#xff0c;与金航标网站&#xff08;www.kinghelm.com.cn&#xff09;、萨科微网站&#xff08;www.slkormicro.com&#xff09;组合成为宣传矩…

Excel 导入指定分隔符的 csv 文件

原文&#xff1a;https://blog.iyatt.com/?p14373 基于 Excel 2024 预览版测试 csv 文件本身是纯文本的&#xff0c;同行数据之间通过一定的分隔符打断识别为不同的列&#xff0c;常用的分隔符是英文逗号&#xff0c;使用逗号分隔符的 csv 文件直接用 Excel 打开能正常识别单…

输入网址到网页显示全过程

TCP/IP ⽹络模型 对于同⼀台设备上的进程间通信&#xff0c;有很多种⽅式&#xff0c;⽐如有管道、消息队列、共享内存、信号等⽅式&#xff0c;⽽对于不同设备上的进程间通信&#xff0c;就需要⽹络通信&#xff0c;⽽设备是多样性的&#xff0c;所以要兼容多种多样的设备&am…

封装函数实现一维数组输入、输出以及冒泡排序

1. 代码 #include <stdio.h>int InputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){scanf("%d", &pa[i]);}return 0; }int OutputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){printf("%-2d ", pa[i]);}putc…

中标,我们是认真的!菊风再携手吉林银行打造智能双录系统

当前&#xff0c;数字化发展步伐持续加快&#xff0c;各个金融机构纷纷按下数字化转型的加速键&#xff0c;陆续推进数字化发展战略&#xff0c;加快数字金融建设。近期&#xff0c;吉林银行面对业务快速发展的需要&#xff0c;服务效率、人力成本等挑战日益凸显&#xff0c;逐…

YOLOv5全网独家改进: 注意力机制改进 | 并行化注意力设计(PPA)模块,红外小目标暴力涨点 | 2024年3月最新成果

💡💡💡本文独家改进:红外小目标涨点利器,在多个数据集下进行验证,其中并行化 patch-aware 注意力(PPA)模块,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如…

MySQL的基本操作与增删改查管理操作

一、MySQL数据库sql语句 1.1 sql 命令 database数据库table表row行column列user用户select从数据表中获取数据updata更新数据库中的数据delete从数据库中删除数据insert into 向数据表插入数据create database创建新数据库alter database修改数据库create table创建新表alter…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

AI数字人“搅局”直播电商

现如今&#xff0c;直播带货已然成为了备受消费者欢迎的一种新的购物模式&#xff0c;人们已经愈发习惯在直播间购物了。在直播带货热度居高不下背后&#xff0c;除了低价优势之外&#xff0c;还在于直播带货所具备的实时互动、全方位展示能够为消费者带去更加真实、直观、沉浸…

Java集合框架初学者指南:List、Set与Map的实战训练

Java集合框架是Java语言的核心部分&#xff0c;它提供了丰富的类和接口&#xff0c;用来高效地管理和操作大量数据。这个强大的工具箱包括多种集合类型&#xff0c;其中最为常用的是List、Set和Map。 1.List - 有序且可重复的数据清单 概念&#xff1a; List就像一个购物清单&…

python usb与下位机 硬件通信

需求分析 上周接到一个需求 用usb和硬件连接 轮询读取usb中指定功能码的指定个数的数据并生成一个桌面程序 刚接到这个需求时 我第一时间想到的就是使用python去尝试 期间也踩了很多的坑 第一版效果如下 特此记录 环境搭建 首先第一点就是将所需要的库进行安装 这里是我这…

Springboot2 restTemplate 使用UriComponentsBuilder时编码问题

文章目录 简要说明maven依赖样例代码 简要说明 在使用springboot2的restTemplate配合UriComponentsBuilder&#xff0c;UriComponentsBuilder拿到uri字符串时有编码过程&#xff0c;而restTemplate在execute时&#xff0c;底层也是有encode编码&#xff0c;这样就到时了双重编…

基于ssm的校园驿站管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…