文章目录
一、树(tree)的概念
树是一种基本的“非线性”数据结构,在计算机科学的各个领域中被广泛应用(操作系统、图形学、数据库系统、计算机网络)。
跟自然界中的树一样,数据结构树也分为:根、枝和叶等三个部分。一般数据结构的图示把根放在上方,叶放在下方。
1. 树的例子:生物学的物种分类
-
分类树的第一个特征:分类体系是层次化的,树是一种分层结构,越接近顶部的层越普遍,越接近底部的层越独特:界、门、纲、目、科、属、种。
-
分类树的第二个特征:一个节点的子节点与另一个节点的子节点,相互之间是隔离、独立的。猫属Felis和蝇属Musca下面都有Domestica的同名节点,但相互之间并无任何关联,可以修改其中一个Domestica而不影响另一个。
-
分类树的第三个特征:每一个叶节点都具有唯一性。可以用从根开始到达每个种的完全路径来唯一标识每个物种。如:Animalia->Chordate->Mammal->Carnivora->Felidae->Felis->Domestica。
2. 树的例子:Unix文件系统
3. 树的例子:HTML文档(DOM树)
二、树结构的相关术语
下面这些术语,会在后面树的学习中用到。
-
节点Node:组成树的基本部分。
每个节点具有名称,或“键值”,节点还可以保存额外数据项,数据项根据不同的应用而不同。
-
边Edge:组成树的另一个基本部分。
每条边恰好连接两个节点,表示节点之间具有关联,边具有出入方向;每个节点(除根节点)恰有一条来自另一节点的入边;每个节点可以有多条连到其它节点的出边。
-
根Root:树中唯一一个没有入边的节点。
-
路径Path:由边依次连接在一起的节点的有序列表。
如上面DOM树中的:html->body->ul->li。
-
子节点Children:入边均来自于同一个节点的若干节点,称为这个节点的子节点。
如上面DOM树中,body下的ul、h1、h2,都是body的子节点。
-
父节点Parent:一个节点是其所有出边所连接节点的父节点。
如上面DOM树中,body和它下面的ul、h1、h2,其中body是后三者的父节点。
-
兄弟节点Sibling:具有同一个父节点的节点之间称为兄弟节点。
如上面DOM树中,body下的ul、h1、h2,三者互为兄弟节点。
-
子树Subtree:一个节点和其所有子孙节点,以及相关边的集合。
如上面DOM树中,body下的所有节点和边(不包括html与body之间的),构成了一棵新的树,称为整个DOM树的子树。
-
叶节点Leaf:没有子节点的节点称为叶节点。
如上面DOM树中,meta、title、两个li、h1以及a,都是叶节点。
-
层级Level:从根节点开始到达一个节点的路径,所包含的边的数量,称为这个节点的层级。
如上面DOM树中,body为1级,h2为3级,a为3级。
-
高度:树的所有节点中,最大的层级称为树的高度。
如上面DOM树中,a和两个li的层级最大,都为3,所以DOM树的高度为3。
1. 树的定义1
树由若干节点,以及两两连接节点的边组成,并有如下性质:
- 其中一个节点被设定为根;
- 每个节点n(除根节点),都恰好连接一条来自节点p的边,p是n的父节点;
- 每个节点从根开始的路径是唯一的;
- 如果每个节点最多有两个子节点,这样的树称为“二叉树”,这是一种典型的树结构。
2. 树的定义2(递归版本)
树是:
- 空集;
- 或者由根节点及0个或多个子树构成(其中子树也是树),每个子树通过边,直接或间接与根节点相连。