1.基本概念
在数据的组织中,树结构的确是一个突破,因为用它实现的一系列算法比使用线性数据结构(如基于数组的列表或链表)要快得多。树也为数据提供了一个更加真实、自然的组织形式,并由此在文件系统、图形用户界面、数据库、网站和其他计算机系统中广泛应用。
2.树的定义和属性
树是一种将元素分层次存储的抽象数据类型。除了最顶部的元素,每个元素在书中都有一个双亲节点和多个或者零个的孩子节点。通常称最顶部的元素为树根(root), 在图中它被作为最顶部的元素,因为其他元素都被连接在它的下面(这与真实世界中的书正好相反)
如上面这棵树所示,节点A是这棵树的根节点,B、E、K是A的孩子节点,A是它们的父节点。B是C、D的父节点,C、D是它的子节点。同时,B、E、K互为兄弟节点。其中,K为外部节点(也称叶子节点)。B、E为内部节点。
属性
通常我们将树T定义为存储为一系列元素的有限节点集合,这些节点都具有 parent-children 关系并且满足如下属性:
- 如果树T不为空,则它一定具有一个称为根节点的特殊节点,并且该节点没有父节点。
- 每个非根节点v都具有唯一的父节点w,每个具有父节点w的节点都是节点w的一个孩子。
注意,上面定义,一棵树可能为空,这意味着它不含有任何节点。这个约定也允许我们递归地定义一棵树,以使这棵树要么为空,要么包含一个节点r,其他一系列子树的根节点是r的孩子节点。
和其他节点关系
同一个父亲节点的孩子节点之间是兄弟关系。一个没有孩子的节点称为外部节点。有一个孩子或者多个孩子的节点称为内部节点。外部节点也称为叶子节点。
树的边和路径
树T的一条边指的是一对节点(u,v),这里u是v的父节点或者v是u的父节点。树T当中的路径指的是一系列的节点,这些节点中任意两个连续的节点之间都是一条边。
有序树
如果树中每个节点的孩子节点都有特定的顺序,则称该树为有序树,我们将一个节点的孩子节点依次编号为第一个、第二个、第三个等。通常我们按照从左到右的顺序对兄弟节点进行排序。
树的抽象数据类型
我们用位置作为节点的抽象结构来定义树的抽象数据结构。一个元素存储在一个位置,并且位置信息满足树中的父节点与孩子节点的关系。一棵树的位置对象支持如下方法:
- p.element() :返回存储在位置p的元素。
- T.root():返回树T的根节点的位置。
- T.is_root( p):如果位置p是树T的根节点,返回True。
- T.parent( p ):返回位置为p的父节点的位置。如果p的位置为树的根节点,返回None。
- T.num_children( p ):返回位置为p的孩子节点的编号。
- T.children( p ):产生位置为p的孩子节点的一个迭代。
- T.isleaf( p ) :判断位置p是否是叶子节点
- len(T):返回树T所包含的元素数量。
- T.position():迭代地生成树T的所有位置。
深度与高度
深度:
假定p是树T的一个节点,那么p的深度就是节点p的祖先的个数,不包括p本身。
- 如果p是根节点,p的深度为0。
- 否则,p的深度就是其父节点的深度加1.
高度:
如果p是一个叶子节点,那么它的高度为0。否则,p的高度是它孩子节点中的最大高度加1.