树和二叉树的定义和基本术语

news/2024/5/20 21:33:05

文章目录

  • 前言
  • 一、树的定义
  • 二、树的基本术语
  • 三、二叉树的定义
  • 总结


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、树的定义

  树(Tree),是 n (n>=0)个结点的有限集,它或为空树(n = 0); 或为非空树,对于非空树T:
  (1)有且仅有一个称之为根的结点;
  (2)除根结点以外的其余结点可分为 m (m>0) 个互不相交的有限集 T1, T2…其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
  例如,在下图中,(a)是只有一个根结点的树;(b)是有13个结点的树,其中A是根结点,其余结点分成3个互不相交的子集: T1={B,E, F, K, L}, T2={C,G}, T3= {D, H, I, J, M}。Ti、T2和T3都是根A的子树,且本身也是一棵树。例如T1,其根结点为B, 其余结点分为两个互不相交的子集: T11= {E, K, L} , T12 = {F}。T11中 E 又是一个子树的根结点…
在这里插入图片描述
  因此可知,树的结构定义是一种递归定义(链表???(幻视)),且数据关系是一对多。

二、树的基本术语

(1) 结点:树中的一个独立单元。包含一个数据元素及若干指向其子树的分支,如上图(b) 中的 A 、 B 、 C 、 D 等。
(2)结点的度(degree):结点拥有的子树数量称为结点的度。例如,A的度为 3, C的度为 1, F的度为 0。
(3)树的度:树的度是树内各结点度的最大值。上图 (b) 所示的树的度3。
(4) 叶子: 度为 0 的结点称为叶子或终端结点。结点 K 、 L 、 F 、 G 、 M 、 I 、 J都是树的叶子。
由此,树的根结点无前驱有后继(n>1),叶子有前驱无后继。注意这里的根节点仅指最大一棵树的根节点,如上图中的A结点,而B结点显然不是最大树的根节点。
(5) 非终端结点:度不为 0 的结点称为非终端结点或分支结点。除根结点之外,非终端结点也称为内部结点,如上图中的E、B、C、D和H。
(6)双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。例如,B的双亲为A, B的孩子有E和F。即结点前驱为双亲,后继为孩子。
(7) 兄弟:同一个双亲的孩子之间互称兄弟。例如,H 、 I 和J互为兄弟。
(8) 祖先:从根结点到该结点所经分支上的所有结点。例如, M 的祖先为 A 、 D 和H。
(9) 子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。如 B 的子孙为E 、 K 、 L和F。
(10) 层次(level):结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等千其双亲结点的层次加1。
(11)堂兄弟:双亲在同一层的结点互为堂兄弟。例如,结点 G 与E 、 F、 H 、 I 、 J互为堂兄弟。
(12)树的深度(height):树中结点的最大层次称为树的深度或高度。上图所示的树的深度为4。
(13)有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
(14)森林:是 m (m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。由此,也可以用森林和树相互递归的定义来描述树。

三、二叉树的定义

  任何树都可以转化为二叉树,而二叉树的许多操作算法简单,因此必须掌握二叉树。
  首先明确一点:二叉树不是树!!!二叉树不是树!!!二叉树不是树!!!(原因见下)
  二叉树(Binary Tree)是 n (n>=0)个结点所构成的集合,它或为空树(n = 0); 或为非空树,对于非空树T:
  (1) 有且仅有一个称之为根的结点T;
  (2)除根结点以外的其余结点分为两个互不相交的子集T1和T2, 分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。
  二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点:
  (1)二叉树每个结点至多只有两棵子树(即二叉树中不存在度大于2 的结点);
  (2)二叉树的子树有左右之分,其次序不能任意颠倒。
 &emsp二叉树的递归定义表明二叉树或为空,或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。由于这两棵子树也是二叉树,由二叉树的定义,它们也可以是空树。由此,二叉树可以有5种基本形态,如下图所示。
在这里插入图片描述
  由此可知,对于一个根节点带一个子树的结构,即c和d,在二叉树中仍然是两个不同的结构,但在树中却是相同的结构,从而,二叉树不是树(强碱不是碱,是盐!)。但上述对树的基本属于在二叉树中也适用。


总结

  路漫漫其修远兮,吾将上下而摆烂。(又是划水的一天,water,water,water,water,water…)
  有任何疑问和补充,欢迎交流。(但我显然不会T_T)


http://www.mrgr.cn/p/86183331

相关文章

【Vue】vue中将 html 或者 md 导出为 word 文档

原博主 xh-htmlword文档 感谢这位大佬的封装优化和分享,亲测有用!可以去看大佬👇的说明! 前端HTML转word文档,绝对有效!!! 安装 npm install xh-htmlword导入 import handleEx…

基于PSO优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PSO优化的PV光伏发电系统simulink建模与仿真。其中PSO采用matlab编程实现,通过simulink的函数嵌入模块,将matlab调用进simulink中。 2.系统仿真结…

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库,所以我们应…

麒麟系统

问题描述 Nginx最新版 Nginx 1.25.0解决方案 开放防火墙端口 开启端口:sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent 关闭端口:sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent 端口生效:firewall-cmd --reload

C#中Linq的去重方式Distinct详解

一、首先创建一个控制台应用程序,添加一个Person对象 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Compare {public class Person{public string Name { get; set; }public int Age { ge…

华为ensp中BFD和OSPF联动(原理及配置命令)

作者主页:点击! ENSP专栏:点击! 创作时间:2024年5月6日20点26分 BFD通常指的是双向转发检测。BFD是一个旨在快速检测通信链路故障的网络协议,提供了低开销、短延迟的链路故障检测机制。它主要用于监测两个…

B/S模式的web通信

这里写目录标题 目标实现的目标 服务器代码(采用epoll实现服务器)整体框架main函数init_listen_fd函数(负责对lfd初始化的那一系列操作)epoll_run函数 一级目录二级目录二级目录二级目录 目标 实现的目标 我们要实现,…

数字集成电路 NMOS工作区

MOSFET是一个四端器件(栅极、源极、漏极、衬底)。 衬底一般连接到一个直流电源端:NMOS的衬底接地GND,PMOS的衬底接高电平VDD。(为了使得MOS管中的PN结零偏或反偏,尽管如此,二极管的结电容也会对电路产生影响)(PN结正偏不仅会形成通路,也会导致结电容急剧增大 C=ES/D) N…

Python-----容器的介绍以及操作

1.列表和元组 1.列表是什么, 元组是什么: 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. 但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表 列表…

力扣138. 随机链表的复制

Problem: 138. 随机链表的复制 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建Map集合Map<Node, Node> map;创建指针cur指向head&#xff1b; 2.遍历链表将cur作为键&#xff0c;new Node(cur.val)作为值&#xff0c;存入map集合&#xff1b; 3.再次…

FPGA+炬力ARM实现VR视频播放器方案

FPGA炬力ARM方案&#xff0c;单个视频源信号&#xff0c;同时驱动两个LCD屏显示&#xff0c;实现3D 沉浸式播放 客户应用&#xff1a;VR视频播放器 主要功能&#xff1a; 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文件播放 4.支持定制化配置…

一招MAX降低10倍,现在它是我的了

一.背景 性能优化是一场永无止境的旅程。 到家门店系统,作为到家核心基础服务之一,门店C端接口有着调用量高,性能要求高的特点。 C端服务经过演进,核心接口先查询本地缓存,如果本地缓存没有命中,再查询Redis。本地缓存命中率99%,服务性能比较平稳。随着门店数据越来越多…

【京东云新品发布月刊】2024年4月产品动态

京东云4月产品动态:1.【言犀AI虚拟主播】"采销东哥"数字人是怎样练成的?“大家好,好久不见,我是你们的老朋友东哥……”面对众网友喊话开直播,刘强东以新的形式与大家见面。4月16日下午6点18分,由京东云言犀打造的“采销东哥”AI数字人开启直播首秀,同时亮相京…

【C++】CentOS环境搭建-编译安装Boost库(附CMAKE编译文件)

【C】环境搭建-编译安装Boost库 Boost库简介Boost库安装通过YUM安装&#xff08;版本较低 V1.53.0&#xff09;通过编译安装&#xff08;官网最新版本1.85.0&#xff09;1.安装相关依赖2.查询官网下载最新安装包并解压3.编译Boost4.安装Boost库到系统路径 Boost库验证 Boost库简…

谷歌Gmail邮箱开启SMTP/IMAP服务流程

本篇专门定向讲解谷歌Gmail邮箱,如何开通SMTP协议的流程,在讲篇幅前,我需要你确定3件事:1.你已经有谷歌账号了2.你很清楚自己为什么想要开通SMTP服务3.你已经掌握一定的基础知识,能够达到翻出了谷歌Gmail邮箱开启SMTP/IMAP服务流程如果你没法“翻出去”,接下来的内容就可…

python教程9-第三方模块安装

https://pypi.python.org/pypi 是python的开源模块库。 收录了⾃全世界python开发者贡献的模块,⼏乎涵盖了你想⽤python做的任何事情。 事实上每个python开发 者,只要注册⼀个账号就可以往这个平台上传你⾃⼰的模块,这样全世界的开发者都可以容易的下载并使⽤你的模块。 下载…

从零在win10上测试whisper、faster-whisper、whisperx在CPU和GPU的各自表现情况

Anaconda是什么? Anaconda 是一个开源的 Python 发行版本,主要面向数据科学、机器学习和数据分析等领域。它不仅包含了 Python 解释器本身,更重要的是集成了大量的用于科学计算、数据分析和机器学习相关的第三方库,并且提供了一个强大的包管理和环境管理工具——Conda。 通…

Allegro PCB designer放置振列过空,Via Array,

首先 Place >>Via Array, 然后配置options 选项卡。 最后鼠标左击一下&#xff0c;拉个区域框&#xff0c;再点击一下。如下图 尤其注意鼠标左击一下再左击一下。

小程序直接生成鸿蒙App的方法

今天来聊聊纯血鸿蒙,这个一直处于风口浪尖的技术话题。操作系统作为软件生态系统的基石,始终是全球科技领域竞争的制高点。今天来聊聊纯血鸿蒙,这个一直处于风口浪尖的技术话题。 操作系统作为软件生态系统的基石,始终是全球科技领域竞争的制高点。 鸿蒙操作系统(HarmonyO…

sqlserver01

我们从下载开始 我们这里下载的是2019,但是醉胡我是通过百度网盘下载的,我们来看一下下载后的文件