数据结构第8问:什么是树?

【本节仅描述树的定义、术语以及相关性质】

定义

树是由若干个结点组成的有限集合。具有如下特征:

  1. 有且仅有一个根结点;
  2. 除根结点外,每个其它结点有且仅有一个直接的父结点;
  3. 除根结点外,每个结点可以有零个或者多个子结点;
  4. 结点之间通过边连接,形成层级关系,且不存在环路。

当有限集合内的元素数大于1时,除根结点外的其余结点可以分为 m(m>0) 个互不相交的有限集,其中每个有限集合本身又是一棵树,并且称为根的子树。

从递归角度来看:

  • 一棵树要么是空树(没有任何节点);
  • 要么由一个根节点和零个或多个子树组成,而这些子树本身又是树。

术语

根节点 :树的起始节点,没有父节点。

父节点,子节点 :结点之间的直接上下级关系。

叶节点 :没有子节点的结点。叶节点的度为0。

分支节点:有子结点的结点称为分支结点。度大于0。

:一个结点的子节点个数。

层次、深度、高度 :结点的层次从根开始定义,根结点为第1层,它的子结点为第2层,以此类推。结点的深度就是结点所在的层次。树的高度或深度是树中结点的最大层数。结点的高度是以该节点为根的子树的高度。

子树(subtree) :以某个结点为根结点的树。

路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的。

路径长度:是路径中所经过的边的数目(即节点数减一)。

说法含义
两结点间的路径长度连接两个结点路径中的边数
树的路径长度(内部路径长度)树中所有结点到根节点路径长度的总和
树的直径(最大路径长度)树中两个结点间最长路径的边数

树的性质

1.树的结点数n等于所有结点的度数之和加1
令一棵树的总结点数为n,那么总度数为n−1,不同度数的结点的数量为nm,m为度数下标,那么n=n0+n1+n2+...+nm=∑i=0mni再求每个不同度数的结点的总度数为m∗nm,那么n−1=1n1+2n2+3n3+...+mnm=∑i=1mini得到:n=∑i=1mini+1=∑i=0mni 令一棵树的总结点数为n,那么总度数为n-1,不同度数的结点的数量为n_m,m为度数下标,那么\\ n = n_0 + n_1 + n_2 + ... + n_m = \sum_{i=0}^m n_i \\ 再求每个不同度数的结点的总度数为m*n_m,那么\\ n - 1 = 1n_1 + 2n_2+ 3n_3 + ... + mn_m = \sum_{i=1}^m in_i \\ 得到:n = \sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i 令一棵树的总结点数为n,那么总度数为n1,不同度数的结点的数量为nm,m为度数下标,那么n=n0+n1+n2+...+nm=i=0mni再求每个不同度数的结点的总度数为mnm,那么n1=1n1+2n2+3n3+...+mnm=i=1mini得到:n=i=1mini+1=i=0mni
由上述推导过程,可以看出,当计算树的总度数的时候,叶节点(没有子节点的结点)是没有贡献的,因为按照计算公式,叶结点的总度数为0。但是当计算总结点数的时候是有的。所以,可以借助最后推导出的公式来计算叶结点的结点数,计算如下:
由于已知:∑i=1mini+1=∑i=0mni然后对等号右边部分提取出n0,得到∑i=0mni=n0+∑i=1mni,等效替换回原式得到∑i=1mini+1=n0+∑i=1mni化简n0=∑i=1mini−∑i=1mni+1=∑i=1m(i−1)ni+1 由于已知:\sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i \\ 然后对等号右边部分提取出n_0,得到\\ \sum_{i=0}^m n_i = n_0 + \sum_{i=1}^m n_i,等效替换回原式得到\\ \sum_{i=1}^m in_i + 1 = n_0 + \sum_{i=1}^m n_i \\ 化简\\ n_0 = \sum_{i=1}^m in_i - \sum_{i=1}^m n_i + 1 = \sum_{i=1}^m (i-1)n_i + 1 由于已知:i=1mini+1=i=0mni然后对等号右边部分提取出n0,得到i=0mni=n0+i=1mni,等效替换回原式得到i=1mini+1=n0+i=1mni化简n0=i=1minii=1mni+1=i=1m(i1)ni+1
2.度为 m 的树中第 i 层上至多有m的(i - 1)次方个结点(i ≥ 1)

已知第一层只有一个结点为根结点;那么第2层至多就有 m 个结点,那么第3层至多就有 m² 个结点,归纳推导出
第i层的结点数≤mi−1,其中(i≥1) 第i层的结点数 ≤ m^{i-1} ,其中(i≥1) i层的结点数mi1,其中(i1)
3.高度为h的m叉树至多有 (m^h - 1)/(m - 1) 个结点

如果要让m叉树的结点数达到最大,那么除第一层外,每层的结点数都应满足 n_h = m^(h-1),计算总结点数为
N=1+m1+m2+m3+...+mh−1=(mh−1)/(m−1) N = 1 + m^1 + m^2 + m^3 + ... + m^{h-1} = (m^h-1)/(m-1) N=1+m1+m2+m3+...+mh1=(mh1)/(m1)
4.度为 m,具有 n 个结点的树的最大高度 h 为 (n - m + 1)

因为已知度为m,那么树中至少有一个结点的子结点数为m;要为了使树的高度最大,度为m的结点的子结点位于同一层,其它层则只放置1个结点。

举例:

  1. 根结点 – 度数为1的子结点 – 度数为1的子结点 – … – 度数为m的子结点
  2. 根结点 – 度数为1的子结点 – 度数为m的子结点 – … – 度数为1的子结点

5.度为 m、具有 n 个结点的树的最小高度 h 为[ log_m (n * ( m - 1 ) + 1 ) ]

首先已知:要使一棵树的高度尽量小,那么每层(除第一层和最后一层)的结点数都应满足性质2。第一层是根结点,最后一层只要有结点就行,不一定要填满。

再借助性质3可以推导出:
当树的高度取得最小高度h的时候:总的结点数最多为(mh−1)/(m−1)最少为(mh−1−1)/(m−1)+1。可得到下列不等式:(mh−1−1)/(m−1)<n≤(mh−1)/(m−1) 当树的高度取得最小高度h的时候:\\总的结点数\\最多为 (m^h - 1)/(m - 1) \\最少为(m^{h-1} - 1)/(m - 1) + 1。\\ 可得到下列不等式: (m^{h-1} - 1)/(m - 1) < n ≤ (m^h - 1)/(m - 1) 当树的高度取得最小高度h的时候:总的结点数最多为(mh1)/(m1)最少为(mh11)/(m1)+1可得到下列不等式:(mh11)/(m1)<n(mh1)/(m1)
然后要明确,求最小高度的位置应该是结点数最多的位置,防止错误的估计高度。因此得到如下临界状态
n=(mh−1)/(m−1)hmin是整数,向上取整取最小值,求解得:hmin=⌈logm(n(m−1)+1)⌉ n = (m^h - 1)/(m - 1)\\ h_{min}是整数,向上取整取最小值,求解得:\\ h_{min} = ⌈log_m (n(m−1)+1)⌉ n=(mh1)/(m1)hmin是整数,向上取整取最小值,求解得:hmin=logm(n(m1)+1)⌉

**森林中有k颗树,总结点数为n,总边数为e,那么 k = n - e。或者说森林中结点数不变,边数减少 1,则森林中的树的棵数增加 1 **

在一棵中,结点数为 n,边数必然是 n−1。森林是若干棵树的集合,因此森林中包含若干棵互不连通的子树。设森林中结点数为 n,边数为 e,树的棵数为 k,则有:树的棵数 k = n − e

推导:
每棵树单独结点数为ni,对应边数为ni−1森林中所有树的结点数和为:∑i=1kni=n森林中所有树的边数和为:e=∑i=1k(ni−1)=∑i=1kni−k=n−k所以森林中树的棵树k=n−e 每棵树单独结点数为 n_i,对应边数为 n_i−1 \\ 森林中所有树的结点数和为:\sum_{i=1}^k n_i = n \\ 森林中所有树的边数和为:e = \sum_{i=1}^k(n_i - 1) = \sum_{i=1}^kn_i - k = n - k \\ 所以森林中树的棵树k = n - e 每棵树单独结点数为ni,对应边数为ni1森林中所有树的结点数和为:i=1kni=n森林中所有树的边数和为:e=i=1k(ni1)=i=1knik=nk所以森林中树的棵树k=ne

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

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

相关文章

PyTorch RNN 名字分类器

PyTorch RNN 名字分类器详解 使用PyTorch实现的字符级RNN&#xff08;循环神经网络&#xff09;项目&#xff0c;用于根据人名预测其所属的语言/国家。该模型通过学习不同语言名字的字符模式&#xff0c;够识别名字的语言起源。 环境设置 import torch import string import un…

面向对象之类方法,成员变量和局部变量

1.类的方法必须包含几个部分&#xff1f;2.成员变量和局部变量类的方法必须包含哪几个部分&#xff1f;.方法名&#xff1a;用于标识方法的名称&#xff0c;遵循标识符命名规则&#xff0c;通常采用驼峰命名法。返回值类型&#xff1a;指定方法返回的数据类型。如果方法不返回任…

古法笔记 | 通过查表进行ASCII字符编码转换

ASCII字符集是比较早期的一种字符编码&#xff0c;只能表示英文字符&#xff0c;最多能表示128个字符。 字符集规定了每个字符和二进制数之间的对应关系&#xff0c;可以通过查表完成二进制数到字符的转换ASCII字符占用的存储空间是定长的1字节 ASCII字符的官方码点表见下图&…

Linux C实现单生产者多消费者环形缓冲区

使用C11里的原子变量实现&#xff0c;没有用互斥锁&#xff0c;效率更高。ring_buffer.h:/*** file ring_buffer.h* author tl* brief 单生产者多消费者环形缓冲区&#xff0c;每条数据被所有消费者读后才释放。读线程安全&#xff0c;写仅单线程。* version* date 2025-08-06*…

复杂场景识别率↑31%!陌讯多模态融合算法在智慧环卫的实战解析

摘要&#xff1a;针对边缘计算优化的垃圾堆放识别场景&#xff0c;本文解析了基于动态决策机制的视觉算法如何提升复杂环境的鲁棒性。实测数据显示在遮挡/光照干扰下&#xff0c;mAP0.5较基线提升28.3%&#xff0c;误报率降低至行业1/5水平。一、行业痛点&#xff1a;智慧环卫的…

MyBatis-Plus Service 接口:如何在 MyBatis-Plus 中实现业务逻辑层??

全文目录&#xff1a;开篇语前言1. MyBatis-Plus 的 IService 接口1.1 基本使用示例&#xff1a;创建实体类 User 和 UserService1.2 创建 IService 接口1.3 创建 ServiceImpl 类1.4 典型的数据库操作方法1.4.1 save()&#xff1a;保存数据1.4.2 remove()&#xff1a;删除数据1…

[激光原理与应用-168]:光源 - 常见光源的分类、特性及应用场景的详细解析,涵盖技术原理、优缺点及典型应用领域

一、半导体光源1. LED光源&#xff08;发光二极管&#xff09;原理&#xff1a;通过半导体PN结的电子-空穴复合发光&#xff0c;波长由材料带隙决定&#xff08;如GaN发蓝光、AlGaInP发红光&#xff09;。特性&#xff1a;优点&#xff1a;寿命长&#xff08;>5万小时&#…

Metronic v.7.1.7企业级Web应用前端框架全攻略

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Metronic是一款专注于构建响应式、高性能企业级Web应用的前端开发框架。最新版本v.7.1.7引入了多种功能和优化&#xff0c;以增强开发效率和用户体验。详细介绍了其核心特性&#xff0c;包括响应式设计、多种模…

鸿蒙开发--Notification Kit(用户通知服务)

通知是手机系统中很重要的信息展示方式&#xff0c;通知不仅可以展示文字&#xff0c;也可以展示图片&#xff0c;甚至可以将组件加到通知中&#xff0c;只要用户不清空&#xff0c;通知的信息可以永久保留在状态栏上通知的介绍 通知 Notification通知&#xff0c;即在一个应用…

鸿蒙 - 分享功能

文章目录一、背景二、app发起分享1. 通过分享面板进行分享2. 使用其他应用打开二、处理分享的内容1. module.json5 配置可接收分享2. 解析分享的数据一、背景 在App开发中&#xff0c;分享是常用功能&#xff0c;这里介绍鸿蒙开发中&#xff0c;其他应用分享到自己的app中&…

【Agent 系统设计】基于大语言模型的智能Agent系统

一篇阿里博文引发的思考和探索。基于大语言模型的智能Agent系统 1. 系统核心思想 核心思想是构建一个以大语言模型&#xff08;LLM&#xff09;为“大脑”的智能代理&#xff08;Agent&#xff09;&#xff0c;旨在解决将人类的自然语言指令高效、准确地转化为机器可执行的自动…

企业级Web框架性能对决:Spring Boot、Django、Node.js与ASP.NET深度测评

企业级Web应用的开发效率与运行性能直接关系到业务的成败。本文通过构建标准化的待办事项&#xff08;Todo&#xff09;应用&#xff0c;对四大主流框架——Spring Boot、Django、Node.js和ASP.NET展开全面的性能较量。我们将从底层架构特性出发&#xff0c;结合实测数据与数据…

为什么 `source ~/.bashrc` 在 systemd 或 crontab 中不生效

摘要&#xff1a;你是否遇到过这样的问题&#xff1a;在终端里运行脚本能正常工作&#xff0c;但用 systemd 或 crontab 自动启动时却报错“命令找不到”、“模块导入失败”&#xff1f; 本文将揭示一个深藏在 ~/.bashrc 中的“陷阱”&#xff1a;非交互式 shell 会直接退出&am…

Linux 磁盘中的文件

1.磁盘结构 Linux中的文件加载到内存上之前是放到哪的&#xff1f; 放在磁盘上的文件——>访问文件&#xff0c;打开它——>找到这个文件——>路径 但文件是怎样存储在磁盘上的 1.1物理结构磁盘可以理解为上百亿个小磁铁&#xff08;如N为1&#xff0c;S为0&#xff0…

【方法】Git本地仓库的文件夹不显示红色感叹号、绿色对号等图标

文章目录前言开始操作winr&#xff0c;输入regedit&#xff0c;打开注册表重启资源管理器前言 这个绿色对号图标表示本地仓库和远程的GitHub仓库内容保持一致&#xff0c;红色则是相反咯&#xff0c;给你们瞅一下。 首先这两个东西你一定要安装配置好了&#xff0c;安装顺序不…

量化交易与主观交易:哪种方式更胜一筹?

文章概要 在投资的世界里&#xff0c;量化交易和主观交易如同冰与火&#xff0c;各自拥有独特的优势与挑战。作为一名投资者&#xff0c;了解这两种交易方式的差异和各自的优缺点至关重要。本文将从决策依据、执行方式、风险管理等方面深入探讨量化交易的精确性与主观交易的灵活…

【JS】扁平树数据转为树结构

扁平数据转为最终效果[{"label":"疼逊有限公司","code":"1212","disabled":false,"parentId":"none","children":[{"label":"财务部","code":"34343&quo…

数据结构4-栈、队列

摘要&#xff1a;本文系统介绍了栈和队列两种基础数据结构。栈采用"先进后出"原则&#xff0c;分为顺序栈和链式栈&#xff0c;详细说明了压栈、出栈等基本操作及其实现方法。队列遵循"先进先出"规则&#xff0c;同样分为顺序队列和链式队列&#xff0c;重…

大数据spark、hasdoop 深度学习、机器学习算法的音乐平台用户情感分析系统设计与实现

大数据spark、hasdoop 深度学习、机器学习算法的音乐平台用户情感分析系统设计与实现

视频汇聚系统EasyCVR调用设备录像保活时视频流不连贯问题解决方案

在使用EasyCVR过程中&#xff0c;有用户反馈调用设备录像保活功能时&#xff0c;出现视频流不连贯的情况。针对这一问题&#xff0c;我们经过排查与测试&#xff0c;整理出如下解决步骤&#xff0c;供开发者参考&#xff1a;具体解决步骤1&#xff09;先调用登录接口完成鉴权确…