第七章 树
书名:古今中外 作者:无名者 本章字数:2454字 发布时间:2022-08-18

树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。它是一种无向图(undirected graph),其中任意两个顶点间存在唯一一条路径。树图广泛应用于计算机科学的数据结构中,比如二叉查找树、堆、Trie树以及数据压缩中的霍夫曼树等。

顶点v展开色数2展开    边v - 1展开    



1定义

2性质

3有根树

4存储

5树的遍历

6森林

7逻辑结构

8作为数据结构

9树的类型


在一棵树中可以指定一个特殊的节点:根。一个有根的树叫做有根树。

有根树中的节点可以根据到根的距离分层。一颗有根树的层数叫做这棵树的高度。节点最多的那一层的节点数叫做这棵树的宽度。对于有根树,每条边都有一个特殊的方向:指向根节点的方向,或者说上一层的方向(或者相反的,指向叶节点的方向,下一层的方向)。一条边的两个端点中,靠近根的那个节点叫做另一个节点的父节点(也叫父亲、双亲、双亲节点),相反的,距离根比较远的那个节点叫做另一个节点的子节点(也可以叫孩子,儿子,子女等)。父亲方向的所有节点都叫做这个节点的祖先,儿子方向的所有节点都叫做这个节点的子孙。没有子节点的子节点叫做叶节点(或者叶子节点)。由于到根的路径只有一条,根节点以外的节点的父节点永远只有一个,祖先就是这个点到根的路径上的所有节点(包括根,不包括这个节点本身)。另外,以一个节点为根的树是指包括这个节点和其所有子孙,并以这个节点为根的树。由于一般不需要这以外的子树,每一个节点也可以对应到一个以其为根的树,一个节点的子树通常也是指以这个节点的子节点为根的树。

如果一颗有根树每个节点的子树最多有n个,同时每个节点在其父节点中都有固定的可能可以留空的位置,这棵树叫做n叉树。其中每个节点都可以有两个固定位置的子树的有根树叫做二叉树,二叉树中每个节点的两个子树分别叫做左子树和右子树,由于位置固定,没有左子树的时候也是可以有右子树的。而“多叉树”通常并不指n为任意值的n叉树,只是在和n叉树作比较的时候表示普通的有根树。

对于随机的树,高度的平均复杂度是O(logn),但是没有限制而且不随机的树高度也可以达到O(n),也就是除了叶节点都只有一个子树,或者常数个分支的情况。所以树作为数据结构时通常需要另外进行平衡。

4存储

对于普通的树,可以像图一样为每一个点存储一个边表(通常按顺序存和每一个点的关系的叫做邻接矩阵,存具体的边的叫做邻接表),或者直接存储所有边的边表等。由于树是稀疏图,所以一般不用邻接矩阵存储。对于有根树,如果用为每一个点储存一个边表的方法,由于每一棵树都只有一个父节点,所以通常指向父节点的边不存在这个表中。同时如果子节点是没有顺序的,也是因为一个节点的子节点不会同时是其他节点的子节点,也可以把子节点直接当成存边的链表的节点,这时候每个节点只需要储存两个指针,所以这种存储方法有时候也会被叫做多叉树转二叉树。

对于子节点是有顺序的有根树,每条边都可以以固定的位置分别储存。对于完全二叉树甚至能直接用一个数组访问所有节点,不另外储存边的信息。有的树可以被设计成固定的从根节点开始访问,这时候可以不储存父节点。同样的,有的树也可以省略子节点,例如并查集。

5树的遍历

对于一般的树,可以用和普通的图一样的方法遍历,比如深度优先搜索和宽度优先搜索。如果和树的每个节点相邻的点有固定的顺序,深度优先搜索可以不储存当前点以外的任何信息,而且不用判重。而在有根树中更方便,所以有根树中很少使用宽度优先搜索。

对于有根树的从根开始的深度优先搜索遍历,有三种特定的顺序:

前序遍历

先访问根节点,然后再访问所有的子树;

后序遍历

先访问子树,然后再访问根节点;

中序遍历

二叉树专用,先访问左子树,然后是根节点,最后是右子树。

注意对于每一种遍历,事实上都得先访问根节点,这里的遍历顺序是指处理节点中的数据的顺序。已知中序遍历和任一其他遍历的情况下,可以还原一个二叉树。一个直观的方法是按前序或者反转的后序插入一个按中序排序的搜索树。已知前序和中序也可以还原一棵树,但是不能知道二叉树中一个节点唯一的子树是在左边还是右边。

事实上也可以把左右的顺序反过来。这些由根开始的遍历方法也适用于特定的一个子树。

6森林

森林比树少一个条件,指没有回路的图。也就是说,森林可能是不连通的,边数可能比树还少,就是说小于顶点数。

森林也可以看成是好多棵互不相连的非空的树,只有一棵树也可以算是森林。不过森林不一定是一棵树。

森林也可以是有根的,这时候森林中的每一棵树都有一个根。

一棵树去掉若干条边也会成为森林,这时候可以看成一棵树分成了好多棵树。森林中的两棵树之间加一条边,也可以把这两棵树合在一起,最终合成一棵树。

很多地方用森林,都是用来表示很多棵树,包括作为逻辑结构、数据结构的时候等。有一种重要的数据结构并查集就是一个有根的森林,可以很快的判断两个元素是不是属于同一个互相独立的集合,以及合并两个集合等。

7逻辑结构

树也通常会用来表示逻辑结构,例如搜索树。表示逻辑结构的树一般是有根树。这种结构类似于有拓扑序的图,每个节点是其之前的节点的后继、分支、子节点等。树的结构中,每个节点之前的节点是唯一的(就是说有唯一的前驱、上层容器、父节点等),另外每一个节点及其后面的部分也都是一棵树。

8作为数据结构

树也是一类重要的数据结构,同时也有逻辑结构的性质,通常也是有根树。主要有搜索树和堆两种,前者的内容是按中序遍历的顺序排序的,后者每个节点的关键字都比它的子节点大(或者小)。复杂度一般在树的高度,也就是O(nlogn)以内。

搜索树可以快速的查找有序的内容或者新内容在已有内容中的位置,也可以进行一些和按这个顺序的范围有关的统计。

堆 (数据结构)是一种优先队列,比搜索树功能少,通常只能很方便的求堆中关键字最小(最大)的数据,不能查找。(当然有的时候求次小和第三小也是很方便的)

很多这类数据结构会给每个点或者边加上一些别的参数。有些数据结构还会破坏本来的树的结构,但是基本还是用的树的模式,一般还是叫做“树”。





上一章 下一章
看过此书的人还喜欢
章节评论
😀 😁 😂 😃 😄 😅 😆 😉 😊 😋 😎 😍 😘 😗 😙 😚 😇 😐 😑 😶 😏 😣 😥 😮 😯 😪 😫 😴 😌 😛 😜 😝 😒 😓 😔 😕 😲 😷 😖 😞 😟 😤 😢 😭 😦 😧 😨 😬 😰 😱 😳 😵 😡 😠 😈 👹 👺 💀 👻 👽 👦 👧 👨 👩 👴 👵 👶 👱 👮 👲 👳 👷 👸 💂 🎅 👰 👼 💆 💇 🙍 🙎 🙅 🙆 💁 🙋 🙇 🙌 🙏 👤 👥 🚶 🏃 👯 💃 👫 👬 👭 💏 💑 👪 💪 👈 👉 👆 👇 👌 👍 👎 👊 👋 👏 👐
添加表情 评论
全部评论 全部 0
古今中外
手机扫码阅读
快捷支付
本次购买将消耗 0 阅读币,当前阅读币余额: 0 , 在线支付需要支付0
支付方式:
微信支付
应支付阅读币: 0阅读币
支付金额: 0
立即支付
请输入回复内容
取消 确认