DS树与二叉树(8)

embedded/2024/10/17 18:15:10/

文章目录

  • 前言
  • 一、
    • 的概念
    • 的相关概念
    • 的存储
    • 的实际运用
  • 二、二叉
    • 二叉的概念
    • 现实中的二叉
    • 特殊的二叉
    • 二叉的性质
    • 二叉的存储结构
      • 顺序存储
      • 链式结构
    • 二叉的意义
  • 三、二叉的相关习题
  • 总结


前言

  脱离了线性表后,我们又迎来了新的篇
  正文开始!


一、

的概念

是一种非线性的数据结构,它是由n(n>=0)个有限节点组成一个具有层次关系的集合,然而在实践中价值不大,但是二叉实践价值比较大(这种集合称为的理由,是它是根朝上,而叶朝下,看起来很像)

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

因此,是递归定义的,既然从定义开始就富有递归色彩,你可以想象后期我们做题的时候,不会少使用递归的
在这里插入图片描述

  • 是递归定义,与此同时需要注意。在形结构中子之间不能有交集,否则就不是形结构

在这里插入图片描述

的相关概念

在这里插入图片描述

  • 节点的度:一个节点含有的子的个数称为该节点的度; 如上图: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)棵互不相交的的集合称为森林;

不用全记,对标黑部分有个印象即可

的存储

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

其中,孩子兄弟表示法如下:

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

在这里插入图片描述

的实际运用

 文件系统通常使用来组织文件和文件夹之间的关系,比如Linux目录结构
在这里插入图片描述

二、二叉

二叉的概念

 二叉(Binary Tree)是n(n>=0)个数据元素的有限集合,该集合可以为空(空二叉),也可以由一个称为根(root)的元素及两个不相交的,被分别称为左子和右子的二叉组成.

在这里插入图片描述

可以看出:

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

所以对于任意的二叉都是通过下列几种情况组成的(空的情况最容易忘记):
在这里插入图片描述

现实中的二叉

 我们学得二叉倒转一下就是现实中的二叉
在这里插入图片描述

特殊的二叉

 一、满二叉:一个二叉,如果每一个层的节点数都达到最大值,则这个二叉为满二叉。换言之一个二叉的层次为K,且节点总数是2^K - 1,则它就是满二叉
在这里插入图片描述
 二、完全二叉:完全二叉是效率很高的数据结构,完全二叉是由满二叉而引出来的。对于深度为K的,有n个结点的二叉,当且仅当其每一个结点都与深度为K的满二叉中编号从1至n的结点一一对应时称之为完全二叉。 要注意的是满二叉是一种特殊的完全二叉
在这里插入图片描述

满二叉是完全二叉的充分不必要条件
像这种就不是完全二叉,原因是最后一层从左到右不连续
在这里插入图片描述

二叉的性质

  • 若规定根节点的层数为1,则一棵非空二叉的第n层上最多有2^(n-1)个结点(满二叉情况)
  • 若规定根节点的层数为1,则深度为h的二叉的最大结点数是2^h-1(满二叉情况)
  • 对任何一棵二叉(非空), 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2,则有 n0=n2 +1

在这里插入图片描述

  • 若规定根节点的层数为1,具有n个结点的满二叉的深度,h= log (n+1). (ps:log (n+1)是log以2
    为底,n+1为对数)
    在这里插入图片描述
  • 对于具有n个结点的完全二叉,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
    于序号为i的结点有:
  1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
  2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
    在这里插入图片描述

二叉的存储结构

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

顺序存储

 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉,因为不是完全二叉会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉顺序存储在物理上是一个数组,在逻辑上是一颗二叉

我们又出现了物理和逻辑上的分裂,就像我们前面链表讲的一样,虽然逻辑上连续,但在物理上所占内存是不连续的

在这里插入图片描述

链式结构

 二叉的链式存储结构是指,链表来表示一棵二叉,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到高阶数据结构如红黑等会用到三叉链
在这里插入图片描述

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; // 当前节点值域
}

二叉的意义

 首先你应该明白,一般使用数组只适合完全二叉,非完全二叉就不适合数组结构存储,普通二叉只适合链式结构存储,其实,我们后面的实际运用其实大部分就是堆排序和搜索用,而不是存储!!!

原因在于:

  1. 首先我们要知道,二叉拥有其特殊的逻辑结构,不同于其他数据结构适合堆数据的增删查改,因为在于开辟的空间消耗大,逻辑也更加复杂,如果使用如此复杂的结构去存储数据,不是没有多少价值的,这样子不如一开始就采用顺序表进行存储数据。同时一般而言,二叉的结构是递归式,用非递归实现更加麻烦
  2. 普通二叉中可能存储元素密度很低,连续存储的结构会造成大量的空间浪费

三、二叉的相关习题

一、
在这里插入图片描述
二、
在这里插入图片描述
三、
在这里插入图片描述
四、
在这里插入图片描述
五、
在这里插入图片描述


总结

  应该第一次见的话,压力还蛮大的,别急,我们继续学习!


http://www.ppmy.cn/embedded/128233.html

相关文章

SeaTunnel 本地部署

SeaTunnel简介&#xff1a;Apache SeaTunnel 介绍-CSDN博客 部署 准备工作​ 在开始本地运行前&#xff0c;您需要确保您已经安装了SeaTunnel所需要的以下软件&#xff1a; 安装Java (Java 8 或 11&#xff0c; 其他高于Java 8的版本理论上也可以工作) 以及设置 JAVA_HOME。…

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

30.数据结构与算法-查找-线性表的查找,顺序查找/折半查找(二分查找)/分块查找

顺序查找 时间效率分析 顺序查找的特点 折半查找&#xff08;二分查找/对分查找&#xff09; 折半查找的性能分析-&#xff08;判定树&#xff09; 分块查找&#xff08;索引顺序查找&#xff09; 分块查找性能分析 分块查找优缺点 三种查找方法的比较

索引和主键的区别

在数据库中&#xff0c;索引和主键是两个重要的概念&#xff0c;它们虽然有联系&#xff0c;但功能和特点也有所不同。以下是对索引和主键的详细解释及其区别。 1. 索引 定义 索引是一种数据库对象&#xff0c;用于加速数据检索。它创建了一个数据结构&#xff08;通常是 B …

2024汽车制造业数字化转型的意义

1. 通过精细化管理实现降本增效 精细化管理&#xff1a;应用数字化技术实现人力、设备、物料等资源的动态配置和精确管控&#xff0c;提高物料流转效率、减少人力投入。通过对设备的自动巡检、运营状态监测、故障诊断和预警、预测性维护&#xff0c;有效降低设备故障停机率&…

蜗牛兼职网的设计与实现(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c…

IT运维管理:监控易如何破解机房监控难题,提升运维效率

在当今数字化转型的浪潮中&#xff0c;企业的IT基础设施日益复杂&#xff0c;机房作为数据处理的核心&#xff0c;其稳定运行直接关系到业务的连续性和安全性。然而&#xff0c;随着服务器、存储设备、网络设备等各类硬件的不断增加&#xff0c;以及虚拟化、云计算等技术的广泛…

深度优先搜索 - 岛屿最大面积

题目描述 给定一个由 0 和 1 组成的非空二维数组 grid &#xff0c;用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&…