5 树与二叉树
5.1 树的基本概念
5.1.1 树的定义
树是由n(n>=0)个结点所构成的有限集合,当n=0时,称为空树。当n>0时,n个结点满足以下条件:
1) 有且仅有一个称为根的结点。
2)其余结点可分为m(m>=0)个互不相交的有限集合,且每个集合又构成一棵树,这课树称为根结点的子树。
树的层次结构体现了数据元素之间具有的层次关系,即对于一颗非空树,其中有且仅有一个没有前驱的结点,这个结点就是根结点,其余结点有且仅有一个前驱,单可以有多个后继。
5.1.2 树的常用术语
1)树的结点
树的结点是由一个数据元素及关联子树的边所组成。例如,上图中的a中只有一个结点,b中有3个节点,c中有13个结点。在计算机程序中,结点中的数据元素一般代表着一些实体,节点中的边代表着实体与实体之间的逻辑关系。
2)结点的路径
结点的路径是指从根根结点到该结点所经历的结点和分支的顺序排序。例如,上图中c中结点J的路径是A->D->J。
3)路径的长度
路径的长度是指节点中路径所包含的分支数。例如,上图c中结点J的路径长度为2。
4)结点的度
结点的度是指该结点所拥有子树的数目。例如,上图c中结点A的度为3,C的度为0。
5)树的度
树的度是指书中所有结点的度的最大值。例如,上图a中树的度为0,b中树的度为1,c中树的度为3。
6)叶结点(终端结点)
叶结点是指树中度为0的结点,叶结点也称为终端结点。例如,上图c中C、E、F、H、I、J、K、L、M都是叶结点。
7)分支结点(非终端 结点)
分支结点是指树中度不为0的节点,分支结点也称为非终端结点。树中除叶结点之外的所有结点都是分支结点。
8)孩子结点(子结点)
一个结点的孩子结点是指这个结点的子树的根结点。例如,上图c中结点B、C、D是结点A的孩子结点,或者说结点A的孩子结点是B、C、D。
9)双亲结点(父结点)
一个结点的双亲结点是指:若树中某个结点有孩子结点,则这个结点就称为孩子结点的双亲结点。例如,上图c中结点A是指结点B、C、D的双亲结点。双亲结点和孩子结点也称为是具有互为前驱和后继关系的结点,其中,双亲结点是孩子结点的前驱,而孩子结点是双亲结点的后继。
10)子孙结点
一个结点的子孙结点是指这个结点的所有子树中的任意结点。例如,上图c中结点B的子孙结点有E、F、G、K、L、M。
11)祖先结点
一个结点的祖先结点是指该结点的路径中除此结点之外的所有结点。例如,上图c中结点L的祖先结点有A、B、G。
12)兄弟结点
兄弟结点是指具有同一双亲的结点。例如,上图c中B、C、D是兄弟节点,它们的双亲结点都是结点A。
13)节点的层次
规定树中根结点的层次为0,则其他结点的层次是其双亲结点的层次加1。例如,上图c中节点K的层次数为3,也可称节点K在树中处于第3层上。
14)树的深度
树的深度是指树中所有结点的层次数的最大值加1。例如,上图a中中树的深度为1,b中树的深度为3,c中树的深度为4。
15)有序树
有序树是指树中各结点的所有子树之间从左到右有严格的次序关系,不能互换。也就是说,如果子树的次序不同则对应着不同的有序树。
16)无序树
与有序树相反,无序树是指树中各结点的所有子树之间没有严格的次序关系。
17)森林
森林是指由m(m>=0)课互不相交的树构成的集合。
5.2 二叉树
5.2.1 二叉树概述
二叉树是一种特殊的树,它的每个结点最多只有两颗子树,并且这两颗子树也是二叉树。由于二叉树中两颗子树有左、右之分,所以二叉树是有序树。下面给出二叉树的具体定义。
1. 二叉树的定义
二叉树是由n(n>=0)个结点所构成的有限集合。当n=0时,这个集合为空,此时的二叉树为空树;当n>0时,这个集合是由一个根结点和两个互不相交的分别称为左子树和右子树的二叉树构成。
二叉树与树的区别:
1)树中每个结点都可以有多颗子树,而二叉树中的每个结点最多有两颗子树
2)树中的子树是不分顺序的,而二叉树中的子树有严格的左、右之分。
3)二叉树与度小于2等于的树也不同。在二叉树中允许某些结点只有右子树而没有左子树,而在树中,一个结点若没有第一棵子树,则它就不可能有第二棵子树存在。
2. 满二叉树的定义
满二叉树是二叉树的一种特殊形态。如果在一棵二叉树中,它的所有结点或是叶结点,或是左、右子树都非空,并且所有叶结点都在同一层上,则称这可二叉树为满二叉树。
3. 完全二叉树的定义
完全二叉树也是二叉树的一种特殊形态。如果在一棵具有n个结点的二叉树中,它的逻辑结构与满二叉树前n个结点的逻辑结构相同,则成这样的二叉树而完全二叉树。
4. 单分支树的定义
若二叉树的所有结点都没有右孩子或没有左孩子,则此二叉树为单分支树。单分支树又可分为左支树和右支树,其中所有结点都没有右孩子的二叉树称为左支树,所有结点都没有左孩子的树称为右支树。
5.2.2 二叉树的性质
性质1 二叉树中第i(i>=0)层上的结点树最多为2^i。
性质2 深度为h(h>=1)的二叉树中最多有2^h-1个结点。
性质3 对于任何一棵二叉树,若其叶结点的个数为n0,度为2的节点个数为n2,则有n0=n2+1。
性质4 具有n个结点的完全二叉树,其深度为int(log2n)+1。
性质5 有n个结点的完全二叉树,若从根结点开始自上到下并且按照层次有左向右对结点从0开始变编号,则对于任意一个编号i(0<=i<n)的结点有:
1)若i=0,则编号为i的节点时二叉树的根结点,它没有双亲;若i>1,则编号为i的结点其双亲的编号为
2)若2i+1>=n,则编号为i的结点无左孩子,否则编号为2i+1的结点就是其左孩子
3)若2i+1>=n&#x