树的概念及结构

news2024/9/21 14:47:20

前言

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

(1)树的特点

  1. 有一个特殊的结点,称为根结点,根节点没有前驱结点

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

  3. 因此,树是递归定义的。

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

(2)树的相关概念

在这里插入图片描述

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

(3)树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间 的关系,实际中树有很多种表示方式.
我们这里就简单的了解其中最常用的孩子兄弟表示法。

我们在顺序表,链表中,我们都可以有很好的逻辑结构,和物理结构,我们在使用的时候,能很容易的表示他们,但是我们树在我们的逻辑结构中,既有父节点,又有双亲结点,我们怎么样将这两个链接起来,这时一件很难得事情,所以,这时有人提供了一种思路,叫做孩子兄弟表示法。

孩子兄弟表示法

<1>孩子兄弟表示法设计的思路

: 我们先将头结点设置为第一个结点,先设计一个指针,叫做孩指针,存放它第一个孩结点的指针,然后在设计一个指针,叫做兄弟指针,将他的兄弟结点链接起来,就这样依次类推,将我们的所有结点就可以包括了,这种设计思路太巧妙了,大家可以多多参考一下。

孩子兄弟设计的物理结构,在代码中的体现

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

孩子兄弟设计的逻辑结构,用画图来体现

在这里插入图片描述

二叉树

(1)二叉树的概念

一棵二叉树是结点的一个有限集合,该集合要么为空
要么是由一个根节点加上两棵别称为左子树和右子树的二叉树组成

在这里插入图片描述

(2)二叉树的特点

二叉树的特点

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

注意:对于任意的二叉树都是由以下几种情况复合而成的
在这里插入图片描述

(3)特殊的二叉树

两种特殊的二叉树

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

在这里插入图片描述

(4)二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2 i − 1 2^{i-1} 2i1个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数 2 h − 1 2^h-1 2h1
  3. 对任何一棵二叉树, 如果度为0,其叶结点个数为n, 度为2的分支结点个数为m,则有n=m+1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,$h= log_2(h-1)$
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对 于序号为i的结点有
    <1> 若i>0i位置节点的双亲序号:(i-1)/2i=0i为根节点编号,无双亲节点
    <2> 若2i+1<n,左孩子序号:2i+12i+1>=n否则无左孩子
    <3> 若2i+2<n,右孩子序号:2i+22i+2>=n否则无右孩子

(5)二叉树的存储结构

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

顺序结构

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

逻辑结构就是我们想象出来的,而物理结构就是实际存在的。
在这里插入图片描述

链式结构

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。链式结构又分为二叉链和三叉链.

在这里插入图片描述

二叉树的顺序结构

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

在这里插入图片描述

总结

我们介绍了树和二叉树的基本概念,实际难度有点小,但是在我们后面的学习起到了至关重要的作用,只有了解这个我们后续的学习才能跟上,我们下面会学习堆的基本概念,以及用数组的方式实现。

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

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

相关文章

Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

采用aar方式将react-native集成到已有安卓APP

关于react-native和android的开发环境搭建、环境变量配置等可以查看官方文档。 官方文档地址 文章中涉及的node、react等版本&#xff1a; node:v16.18.1 react:^18.1.0 react-native:^0.70.6 gradle:gradle-7.2开发工具&#xff1a;VSCode和android studio 关于react-native和…

即拼商城系统之七人拼团会员模式

即拼商城系统之七人拼团会员模式&#xff0c;在商城选购399商品可加入会员体系&#xff0c;参加7人拼团盈利。购买产品或礼包成为团长&#xff0c;铺满剩余6个位置拼团成功。满团后即可用赚来的钱去复购礼包再次开团&#xff0c;继续盈利。 ◇◆商城系统团长获得礼包提成&#…

【matplotlib】可视化解决方案——如何向图表中添加数据表

概述 虽然 matplotlib 主要用途是绘图&#xff0c;但是他还是可以在绘图时帮助我们做一些其他事务&#xff0c;比如在图表旁边放置一个整齐的数据表格。我们必须明白为数据绘制可视化图形主主要是是为了解释那些不能理解的数据。将一些来自数据整体集合的总结性或者突出强调的…

大地量子全面使用亚马逊云科技提供的多样化云服务

近年来&#xff0c;我国光伏和风电并网装机容量持续增长&#xff0c;截至2021年底&#xff0c;全国可再生能源装机规模突破10亿千瓦&#xff0c;占总发电装机容量的44.8%。其中&#xff0c;风电装机3.28亿千瓦、光伏发电装机3.06亿千瓦。风光电总装机和新增装机规模多年来位居全…

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…

MyBaits

MyBaitsMyBaits的jar包介绍MyBaits的入门案例创建实体java日志处理框架常用的日志处理框架Log4j的日志级别Mybatis配置的完善Mybatis的日志管理使用别名alias方式一方式二SqlSession对象下的常用API查询操作Mapper动态代理Mapper 动态代理规范查询所有用户根据用户ID查询用户Ma…

MMPBSA计算--基于李继存老师gmx_mmpbsa脚本

MMPBSA计算–基于李继存老师gmx_mmpbsa脚本 前期准备 软件安装 安装gromacs, 可以查阅 我的blogGromacs-2022 GPU-CUDA加速版 unbantu 安装 apbs, sudo apt install apbs 安装 gawk, sudo apt install gawk MD模拟好的文件 我们以研究蛋白小分子动态相互作用-III(蛋白配体…

钓鱼网站+bypassuac提权

本实验实现1 &#xff1a;要生成一个钓鱼网址链接&#xff0c;诱导用户点击&#xff0c;实验过程是让win7去点击这个钓鱼网站链接&#xff0c;则会自动打开一个文件共享服务器的文件夹&#xff0c;在这个文件夹里面会有两个文件&#xff0c;当用户分别点击执行后&#xff0c;则…

【面试题】vue中的插槽是什么?

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库一、slot是什么在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占位符该占位符可以在后期…

Docker----------day3

常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…

100种思维模型之九屏幕分析思维模型-016

一、认识九屏幕分析思维模型 1.九屏幕分析思维模型定义 九屏幕法是TRIZ理论中的创新思维方法五大方法之一。它是把问题当成一个系统来研究&#xff0c; 关注系统的整体性、 层级性、目的性&#xff0c;即各要素之间的结构。 九屏幕法是按照时间和系统层次两个维度进行思考。 包…

MAC中docker搭建fastdfs

1:首先搭建Docker2:通过Docker搭建fastdfs&#xff08;1&#xff09;查找镜像打开终端通命令查找fastdfs的镜像docker search fastdfs&#xff08;二&#xff09;拉取镜像在找到合适的镜像后执行命令:docker pull delron/fastdfs&#xff08;三&#xff09; 创建storage和track…

软件设计(十四)-UML建模(上)

软件设计&#xff08;十三&#xff09;-原码、反码、补码、移码https://blog.csdn.net/ke1ying/article/details/129115844?spm1001.2014.3001.5501 UML建模包含&#xff1a;用例图&#xff0c;类图与对象图&#xff0c;顺序图&#xff0c;活动图&#xff0c;状态图&#xff…

论文复现:模拟风电不确定性——拉丁超立方抽样生成及缩减场景(Matlab)

风电出力的不确定性主要源于预测误差&#xff0c;而研究表明预测误差&#xff08;e&#xff09;服从正态分布且大概为预测出力的10%。本代码采用拉丁超立方抽样实现场景生成[1,2]、基于概率距离的快速前代消除法实现场景缩减[3]&#xff0c;以此模拟了风电出力的不确定性。 1 …

26岁曾月薪15K,现已失业3个月,我依然没有拿到offer......

我做测试5年&#xff0c;一线城市薪水拿到15K&#xff0c;中间还修了一个专升本&#xff0c;这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知&#xff0c;但我还是对我的薪水不是很满意&#xff0c;于是打算出去面试&#xff0c;希望可以搏一个高薪。 但真到面…

无聊小知识01.serialVersionUID的作用

什么是serialVersionUIDJava&#xff08;TM&#xff09;对象序列化规范中描述到&#xff1a;serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID&#xff0c;JVM将根据您的Serializable类的各个方面自动为您执行此操作。(http://docs.oracle…

神经网络的基本骨架—nn.Module使用

一、pytorch官网中torch.nn的相关简介可以看到torch.nn中有许多模块&#xff1a;二、Containers模块1、MODULE&#xff08;CLASS : torch.nn.Module&#xff09;import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):#nn.Module---所有神经网络模块的…

Find Any File for Mac,本地文件搜索工具

Find Any File for Mac是一款简单好用的本地文件搜索工具&#xff0c;可以让你在本地磁盘上搜索、查找任何文件&#xff0c;包括本地磁盘的名称、 创建或修改日期、 大小或类型和创建者代码等。更好的结果&#xff1a;它为找到的项目提供了另一种分层视图。您可以使用cmd 2切换…

Kafka 安装入门实战

1.下载Kafka 有2个下载网站都可以&#xff1a; https://www.apache.org/dyn/closer.cgi?path/kafka/3.4.0/kafka_2.13-3.4.0.tgz https://kafka.apache.org/downloads 下载完后解压缩&#xff1a; [roottest ~]# tar -xzf kafka-3.4.0-src.tgz [roottest ~]# cd kafka_2.12-…