python数据结构与算法 36 树的基本概念

学习目标

  • 理解什么是树及使用方法
  • 学会使用树实现映射
  • 用列表实现树
  • 用类和引用实现树
  • 用递归实现树
  • 用堆实现优先队列

树的例子

前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树。树在计算机科学中应用广泛,象操作系统、图形学、数据库系统、网络等都要用到树。树和他们在自然界中的表哥——植物树——非常相似,树也有根,有分枝,有叶子。不同之处是,数据结构的树,根在顶上,而叶子在底部。

在开始学习之前,我们来研究几个普通的例子。第一个是生物学上的分级树。图1所示为部分动物的分级树,从这个例子中,我们可以看到树的一些性质。图中显示的第一个性质就是树是分级的,通过分级,形成层级结构,越接近上层的越是一般的共性,底部则是一些具体的东西,顶级的是“界”,第二级是“门”,然后是“纲”,如此等等。不管到分级树的多少层,所有的生物体都是动物界。


图1 生物层级图(看不懂写参考下图)


图1 中文版的生物层级图

你查以从顶部开始,沿着圆圈和箭头组成的路径一直下到底部。在树的每层上,我们都可以问自己一个问题,而且沿着同意的答案走。例如你可以问:“这个动物是脊索动物还是节足动物?”,如果答案是“脊索动物”,那么就沿着脊索动物向下,“这个脊索动物是哺乳动物吗?”如果不是,我们就被困住了(当然,仅限于图中的资料才会困住),如果是在哺乳动物层次上问,“这个哺乳动物是灵长类还是食肉类?”,这种问题可以一直问下去,直到最底层找到动物的名字。

树的另一个性质是,一个节点的所有孩子独立于另一个节点的孩子,例如,猫属有两个孩子,家猫种和狮子种,蝇属也有一个孩子叫家蝇种,但是它的节点不同,与猫属的孩子完全独立。这意味着,我们改变蝇属的孩子不会影响到猫属的孩子。

第三个性质是,每个叶子节点是唯一的,我们可以从动物“界”开始,从根到叶沿着规定的路线唯一地定义每一个物种。例如动物界→脊索动物门→哺乳动物纲→食肉目→猫科→猫属→猫种→家猫

另外一个树形数据结构的例子是我们天天要用的文件系统。文件系统里,目录或文件夹,是树形结构的。图2unix文件系统的部分结构。


图2 unix文件系统的层级图

文件系统与生物层级系统很相似,也可以沿着一条路径从根到任何目录,路径可以唯一地确定一个子目标和他下面的所有文件。

树的另一个性质,出自它的层次特性,即可以把的一棵子树移动到另一个位置,而不会影响到它下面的层级。例如,我们可以把整个的/etc/从根目录移动到usr/下面,这会将到达httpd的路径从/etc/httpd/usr/etc/httpd,但不是会影响httpd目录的内容和子目录。

树的最后一个例子是网页,这面是用HTML写的一个简章网页,图3是文中HTML标志的结构关系:

<html xmlns="http://www.w3.org/1999/xhtml"
      xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=utf-8" />
    <title>simple</title>
</head>
<body>
<h1>A simple web page</h1>
<ul>
    <li>List item one</li>
    <li>List item two</li>
</ul>
<h2><a href="http://www.cs.luther.edu">Luther CS </a><h2>
</body>
</html>


图3 HTML标志符的嵌套树形结构

HTML源码和相应的树形结构是另一个层级实例。注意,树中每一个层级也就是HTML标志的嵌套深度。第一对标签是<html></html>,所有其他标签就嵌在它们里面。检查一遍你将在树的每一层级上发现这种性质。


词汇和定义

我们已经看到树的几个例子,现在正式定义树和树的组成。

节点

节点是树的基本元素。它可以有个名字,叫做“键值”。节点也许有更多的附加信息,称为“负载”。在树的算法中,负载不是核心问题,但在实际问题中用到树的时候,负载经常成为关键元素。

边是树的另一个基本元素,一条边把两个节点连起来表示他们之间的关系。每个节点(除根节点外)都有一条从其他节点伸过来的入边连着,而且每个节点可能伸出去好几条出边。

根是树结构中,唯一没有入边的节点。图2中,/就是树的根。

 路径

路径就是边连接而成的有序列表,元素是节点。例如:哺乳  肉食目  猫科  猫属  家猫种就是一条路径。

孩子

“入边来自同一个节点”的节点集合,叫做那个节点的孩子。图2中,log/,spool/yp/是节点var/的孩子。

父母

一个节点的出边指向其他节点,它就是这些节点的父母。图2中,var/log/,spool/yp/的父母。

兄弟

同一父母的节点叫做兄弟。节点etc/usr/是文件系统树的兄弟。

子树

子树是指一个父母节点和他们的子子孙孙节点和边组成的集合。

叶子节点

叶子节点指没有孩子的节点。如生物层级树中的人和黑猩猩都是叶子节点。

层次

节点的层次,是指从根到这个节点经过的边的数量。例如图1中,Felis的层次是5,根据定义,根节点是0层。

高度

树的高度是指它所有节点层次的最大值。图2中树的高度是2


基本词汇定义完成,我们要对树做一个正式定义。事实上,我们要对做两个正式定义,一个定义包括节点和边,另一个定义是递归定义。递归定义的价值已经被证实。

第一个定义:树包括节点的集合以及连接节点的边的集合。树有以下性质:

  • 一个节点的树称为根节点
  • 任意节点n,除了根节点,都要被另外的唯一节点p所连接,这时p是n的父母。
  • 从根到任意节点有一条唯一的路径
  • 如果每个节点最多有两个孩子,我们把这种树称为二叉树。

图4是第一个定义的树,边用箭头表明连接的方向。



图4 树的定义:节点和边

第二个定义:树或者是一个空集,或者是包括一个根节点和0个或多个子树,每个子树也是树。每个子树的根连到父母树的根。图4所表明的树的递归定义。应用递归定义,我们知道图中至少有4个节点,因为每个三角形代表一个子树,子树中至少包括一个根节点。也许有更多的节点,但是在深入到子树之前无法知晓。








  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法Python) 一、引入概念 1-01算法引入 1-02 时间复杂度与大O表示法 1-03-最坏时间复杂度与计算规则 1-04-常见时间复杂度与大小关系 1-05-代码执行时间测量模块 1-06-Python列表类型不同操作的时间效率 1-07-Python列表与字典操作的时间复杂度 1-08-数据结构引入 二、顺序表 2-01 内存、类型本质、连续存储 recv 2-02 基本顺序表与元素外围顺序表 recv 2-03 顺序表的一体式结构与分离式结构 recv 2-04 顺序表数据区替换与扩充 recv 三、栈 3-01 栈与队列的概念 3-02 栈的实现 3-03 队列与双端队列的实现 四、链表 4-01 链表的提出 4-02 单链表的ADT模型 4-03 Python中变量标识的本质 4-04 单链表及结点的定义代码 4-05 单链表的判空、长度、遍历与尾部添加结点的代码实现 4-06 单链表尾部添加和在指定位置添加 4-07 单链表查找和删除元素 4-08 单链表与顺序表的对比 4-09 单向循环链表遍历和求长度 4-10 单向循环链表添加元素 4-11 单向循环链表删除元素 4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入排序 5-06 插入排序2 5-07 希尔排序 5-08 希尔排序实现 5-09 快速排序 5-10 快速排序实现1 (1) 5-10 快速排序实现1 5-11 快速排序实现2 5-12 归并排序 5-13 归并排序 代码执行流程 5-14 归并排序时间复杂度及排序算法复杂度对比 5-15 二分查找 5-16 二分查找时间复杂度 六、算法 6-01 的概念 6-02 二叉的概念 6-03 二叉的广度优先遍历 6-04 二叉的实现 6-05 二叉的先序、中序、后序遍历 6-06 二叉由遍历确定一棵 ———————————————— 版权声明:本文为CSDN博主「dwf1354046363」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dwf1354046363/article/details/119832814
Python数据结构与算法分析是一个专栏,主要记录了如何使用Python学习数据结构与算法的笔记和练习题。这个专栏包括了Python的内置数据结构和扩展数据结构Python给我们提供了很多现成的数据结构类型,如列表、元组、字典等,这些是系统预先定义好的数据结构。而还有一些数据组织方式需要我们自己去定义和实现,比如栈、队列等,这些被称为Python的扩展数据结构。通过学习这些数据结构算法分析,可以更好地理解和应用Python编程语言。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Python数据结构与算法】(一)基本概念算法分析](https://blog.csdn.net/weixin_45052363/article/details/125099029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python 数据结构与算法详解](https://blog.csdn.net/qq_35029061/article/details/127561227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值