数据结构 【二叉树(上)】

devtools/2024/11/27 14:02:22/

        谈到二叉树,先来谈谈树的概念。

1、树的概念及结构

        树是一种非线性数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的,

        在树这种数据结构中,最顶端的结点称为根结点。在树的使用过程中,由于树的逻辑关系很像人的遗传关系图谱,所以,一般将上一级的结点称为下一级结点的父结点,某一层级结点往上的结点称为该层结点的祖先。这里要注意的一点是:树形结构中,子树之间不能有交集,否则就不是树形结构。

1.1、树的相关概念

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

叶结点:度为0的结点称为叶结点; 如上图:B、C、H、I...等结点为叶结点;

分支结点:度不为0的结点称为分支结点; 如上图:D、E、F、G...等结点为分支结点;

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

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

兄弟结点:处于同一层级的结点称为兄弟节点;

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

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

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

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

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

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

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

1.2、树的表示

        树的表示就比较复杂了,既要保存结点中要存储的数据,也要保存结点之间的相互关系。众多树的表示方法中,左孩子右兄弟表示法是最常用的方法。它的逻辑关系可以表示成下面的形式:

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

2、二叉树

2.1、概念

        一棵二叉树是结点的有限集合,该集合:1.或者为空,2.由一个根节点加上两颗别称为左子树和右子树的二叉树组成,

        从上图可以看出:

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

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

对于任意的二叉树都是由以下几种情况符合而成的:

2.2、特殊的二叉树 

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

        2、完全二叉树:完全二叉树是效率很高的数据结构,对于高度为h的二叉树,它的h-1层的结点全满,第h层的结点是连续的情况下称为完全二叉树。要注意:满二叉树也是一种特殊的完全二叉树。

2.3、二叉树的性质 

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

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

3、对于任何一颗二叉树,如果度为0其结点个数为n0,度为2的分支结点个数为n2,则有n0=n2+1。

4、若规定根结点的层数为1,具有n个节点的满二叉树的深度h=log(n+1),以2为底。

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

3、二叉树的顺序结构及实现

3.1、二叉树的顺序结构

        普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

3.2、堆 

        在二叉树的概念上限制一些条件就是堆。堆有两条性质:1.堆中某个结点的值总是大于或者不小于其父结点的值。2.堆总是一棵完全二叉树。

         堆的实现我将单独写一篇博客来实现。

 

        


http://www.ppmy.cn/devtools/137406.html

相关文章

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 归并排序&#xff08;Merge Sort&#xff09;5. 快速排序&#xff08;Quick Sort&#xff09;6. 堆排序&…

java大视频分片上传

实现原理&#xff0c;前端控制每次上传1mb&#xff0c;后端接受1mb&#xff0c;并记录该分片下标&#xff0c;返回给前端还未上传的下标&#xff0c;直到所有的都上传完成 controller ApiOperation(value "上传视频", notes "上传视频", httpMethod &…

Win7电脑IP地址查看与变换指南

在Windows 7操作系统中&#xff0c;IP地址作为网络通讯的基础信息&#xff0c;对于日常的网络管理和故障排查至关重要。了解如何查看和变换IP地址&#xff0c;可以帮助用户更好地掌握网络状态&#xff0c;优化网络配置。本文将详细介绍在Win7电脑ip地址在哪查看以及Win7电脑ip地…

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的游戏用户行为分析与个性化推荐系统

一、项目背景 大数据技术的发展&#xff1a; 随着大数据技术的不断发展和普及&#xff0c;越来越多的行业开始利用大数据进行业务分析和决策。大数据具有数据量大、数据类型多样、处理速度快等特点&#xff0c;为数据分析和个性化推荐提供了强大的技术支持。 游戏产业的繁荣&am…

Windows Pycharm 远程 Spark 开发 PySpark

一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接&#xff0c;连接虚拟机&#xff0c;选择项目目录即可远程开发

UE5 fieldSystemActor类

在UE5&#xff08;虚幻引擎5&#xff09;中&#xff0c;FieldSystemActor 是用于处理和模拟场景中的物理力场&#xff08;Field Systems&#xff09;的一个重要类。该类提供了一种机制&#xff0c;用于生成和控制力场&#xff0c;进而影响场景中的物理对象。FieldSystemActor 的…

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…

Flink解决延迟数据问题

总结&#xff1a; 水印&#xff1a;对于迟到数据不长 allowedLateness: 迟到时间很长 侧道输出&#xff1a;对于迟到时间特别长 对于延迟数据的理解&#xff1a; 水印机制(水位线、watermark)机制可以帮助我们在短期延迟下&#xff0c;允许乱序数据的到来。 这个机制很好的…