1. 5 第 5 章树和二叉树 树形结构是一种常用的非线性结构,数据元素之间具有一对多的层 次关系,常用于描述各种具有层次关系的数据对象,例如行政组织结构、 文件目录等。本章主要讨论二叉树的存储结构、基本操作的实现及其 应用。 树的定义和基本操作 5.1.1 树的定义和基本术语 1.树的定义 树(是n(n≥0)个结点的有限集。在任意一棵非空树中: tre) (1)有且只有一个称为根(ot)的结点。 ro (2)除根之外的其余n-1个结点被分为m(m≥0)个互不相交的有 限集,其中每个集合本身又是一棵树,称为根结点的子树(subtre)。 可以看出,树的定义是递归的,即在树的定义中又用到了(_) 树的概念。 递归定义和递归操作在树和二叉树中的应用是比较广泛的,应注意领会递 归的实质。 2.树的表示法 树的表示法有树形表示法、文氏图表示法、广义表表示法和凹入表示 法,如图5. 1所示。 其中,树形表示法是最常用的表示方法。在用树形表示法表示的树 中,边的数目(或称分支数,用e表示)恰好比结点的数目(用n表示)少一 个,即e=n-1。这是树形结构最重要的一个结论。 3.树的基本术语 (1)结点:在树中,通常将数据元素称为结点。从计算机的角度来划 分,可以分为终端结点和非终端结点;以树的特征划分,可以分为根结点、 分支结点和叶子结点;用族谱的关系划分,可以分为双亲结点和孩子结点、 祖先结点和子孙结点、兄弟结点和堂兄弟结点。 116 数据结构( C 语言版)(第4版) 图5.树的几种表示法 1 (2)度:分为结点的度和树的度两种。结点的度是指与该结点相连接的孩子结点的 数目。树的度是指树中所有结点的度的最大值。 (3)深度:树是一种分层结构,根结点作为第一层,其余结点的深度(或称层次)为其 双亲结点的层数加1。树的深度(或称层数)是指树中所有结点的层次的最大值。 (4)有序树与无序树:如果将树中结点的各棵子树看成是从左到右有次序的(即不 能互换),则称该树为有序树,否则称该树为无序树。 (5)有向树与无向树:如果树的每个分支都是有方向的,则称该树为有向树,否则称 该树为无向树。 (6)n元树:树的度为n的有向树。 (7)位置树:指树中每个结点的孩子结点的位置不能被改变(改变则不是原树)的有 向树。例如,某结点可能没有第一个孩子结点,但却可能有第二个和第三个孩子结点。 (8) m 叉树:指树的度为m的有向位置树,即m元位置树。 (9)森林:指m(m≥0)棵互不相交的树的集合。对于树中的每个结点,其子树的集 合就是森林,因此森林和树是密切相关的。森林中的树也可以有顺序关系和位置关系。 5.1.2 树的基本操作 树的基本操作通常有以下几种。 ()初始化操作InitTre(T),用于建立一棵空树T。 ()清空操作CleTre(T),用于释放树T占用的存储空间。 ()判空操作EmpTre(T),用于判断树T是否为空树。 ()求深度操作DepTre(T),用于计算树T的深度。 ()插入操作Insid(p,c),用于在树T中插入子树c,使其成为p指向的结点 ChlT,i, 的第i棵子树。 eid(p,用于删除树T中p所指结点的第i棵子树。 (6)删除操作DlChlT,i), (7)遍历操作TraTre(T),用于按某种次序对树T中的所有结点进行访问,且每个 第 5 章 树和二叉树 71 结点仅访问一次。 二叉树是一种最简单的树形结构,它有许多好的性质,且任何树都可以转化为二叉 树。因此,下面重点研究二叉树的性质、存储结构及其应用。 5.二叉树 2 5.2.1 二叉树的定义和基本操作 1.二叉树的定义 二叉树(binarytre)是一种特殊的有向树,也称二元位置树,它的特点是每个结点至 多有两棵子树,即二叉树中的每个结点至多有两个孩子结点,且每个孩子结点都有各自的 位置关系。或者说,二叉树的子树有左右之分,其次序不能任意颠倒。具体地,二叉树或 者为空,或者由一个根结点及两棵不相交的、分别称为左子树和右子树的二叉树组成。 根据二叉树的定义,二叉树有5种形态,2所示。 如图5. 图5.二叉树的5种基本形态 2 【1】 例5.列举出只有两个结点、三个结点的二叉树的所有形态。 (1)只有两个结点的二叉树的形态有两种,如图5. 3所示。 图5.只有两个结点的二叉树的所有形态 3 (2)只有三个结点的二叉树的形态有五种,4所示。 如图5. 图5.只有三个结点的二叉树的所有形态 4 数据结构( C 语言版)(第4版) 满二叉树和完全二叉树是两种特殊形态的二叉树,在实际应用中经常用到。 满二叉树是除叶子结点外的任何结点均有两个孩子结点,且所有叶子结点都在同一 层的二叉树。这种二叉树的特点是每一层上的结点数目都是最大值。图5.5(a)是一棵深 度为4的满二叉树。 图5.满二叉树与完全二叉树 5 完全二叉树是除去最底层结点后的二叉树是一棵满二叉树,且最底层结点均靠左对 齐的二叉树。在这里,靠左对齐的含义是左边是满的,即没有空隙再放入任何一个结点。 图5.b) 满二叉树是完全二叉树的一个特例。 5(是一棵深度为4的完全二叉树。实质上, 2.二叉树的基本操作 二叉树的基本操作通常有以下几种。 (1)创建操作CreBiTre(bt),用于建立一棵二叉树bt。 (2)先序遍历操作PreOrder(bt),用于先序遍历二叉树bt。 (3)中序遍历操作InOrder(bt),用于中序遍历二叉树bt。 (4)后序遍历操作PostOrder(bt),用于后序遍历二叉树bt。 (5)查找操作Search(bt,x,p),用于在二叉树bt中查找值为x的结点,并通过p带 回该结点的指针。 (6)插入操作InsTre(bt,p,x),用于在二叉树bt中p指向的结点位置插入一个值 为x的结点。 (7)删除操作DelTre(bt,p),用于在二叉树bt中删除p指向的结点。 5.2.2 二叉树的性质 二叉树有许多性质,也就是说,二叉树的理论基础较强,应用也较为广泛,下面依次进 行讨论 性质。 1:在二叉树的第i(i≥1)层上至多有2i-1个结点。 该性质的证明利用数学归纳法很容易实现,留给读者自行思考。 性质2:深度为k(k≥1)的二叉树上至多有2k-1个结点。 该性质的证明直接利用性质1即可,留给读者自行思考。 性质3:在任意一棵二叉树中,叶子结点的数目(用n0 表示)总是比度为2的结点的 第5 章 树和二叉树 1 19 数目(用n2 表示)多一个,即n0=n2+1。 证明:设二叉树的结点总数为n,度为1的结点数为n1,则有 n=n0 +n1 +n2 (5-1) 在二叉树中,除根结点之外的每个结点都有唯一的一个分支进入。设分支总数为e, 则有 e=n-1 (5-2) 由于这些分支或者是度为1的结点射出的,或者是度为2的结点射出的,所以有 e=n1 +2n2 (5-3) 由式(5-2)和式(5-3)可以得到 n=n1 +2n2 +1 (5-4) 由式(5-1)和式(5-4)可以得到 n0 =n2 +1 证毕。 性质4:具有n个结点的完全二叉树的深度为log2n +1。 证明:设具有n个结点的完全二叉树的深度为k,则由性质2可知 2k-1 -1