一、树的基本概念
1.1 树的定义
树是N个结点的有限集合,N=0时称为空树。任何一颗非空树均满足有且仅有一个根结点,其余结点可分为m个互不相交的有限集合,其中每一个集合本身又是一棵树,称为根结点的子树。
树的定义是递归的,一棵树由若干个子树组成,子树又由更小的子树构成。树是一种重要的非线性结构,也是一种分层结构,用来描述客观世界中广泛存在的层次结构。
图1 树知识结构
1.2 基本术语
树的树形表示:
图2 树形结构
(1)考虑K结点,根A到结点K的唯一路径上的任意结点,称为K的祖先结点。如结点B为K的祖先结点,K为结点B的子孙结点。结点E称为K的双亲结点,K为结点E的孩子结点。有相同双亲的结点称为兄弟结点,如结点K和结点L为兄弟结点。
(2)树中一个结点的子结点个数称为该结点的度,树中结点的最大度数称为树的度。如节点B的度为2,节点D的度为3,树的度为3。
(3)度大于0的结点称为分支结点(非终端节点);度为0(没有子女结点)的结点称为叶子结点(终端节点)。每个结点的分支数就是该节点的度。
(4)节点的深度、高度和层次
结点层次从树根开始定义,根节点为第一层,它子结点为第二层,以此类推。
结点深度从根结点开始自顶向下逐层累加。
结点高度从叶结点开始自底向上逐层累加。
树的高度是树中节点最大的层数,如上图树的高度为4。
(5)有序树和无序树。树中结点的左右是有次序的,不能交换称之为有序树;反之称为无序树。
(6)路径和路径长度,两结点间路径是两个结点之间所经过的结点序列构成的,路径长度是路径上经历过的边的个数。如上图,结点A和K的路径长度为3,中间经过结点B和结点E。
(7)森林,森林是m颗互不相交的树的集合。把树的根节点删去就成了森林,反之,给n颗独立的树加上一个跟结点,森林就成了树。
1.3 树的性质
(1) 树中结点数等于所有结点的度数加1
(2) 度为m的树中第i层上至多有mi-1个结点(i >= 1)
(3) 高度为h的m叉树至多有(mh-1)/(m-1)个结点
(4) 具有n个结点的m叉树的最小高度为⌈logm(n(m-1)+1)⌉(向上取整)
树结点与度之间的关系:
1. 总结点数 = N0+ N1+ N2 + … + Nm;
2. 总分支数 = 1* N1 + 2* N2 + … + m* Nm(度为m的结点引出m条分支)
3. 总结点数 = 总分支数 + 1
二、二叉树的概念
2.1 二叉树的定义
二叉树的特点是每个结点至多有两颗子树(不存在度大于2的结点),并且其子树有左右之分,次序不能颠倒,即使在结点只有一颗子树的情况下也要明确指出是左子树还是右子树。
几个特殊的二叉树
1.满二叉树
一颗高度为h且含有2h-1个结点的二叉树称为满二叉树,树中的每一层都含有最多的结点,满二叉树的叶子结点都集中在最底层,除叶子结点之外的其他结点度均为2。
图3 满二叉树
对满二叉树按层次顺序编号如上图,约定根结点从1开始,自上而下,自左至右。那么对于编号为i的结点,若有双亲,其双亲为⌊i/2⌋ (向下取整),若有左孩子则为2i,若有右孩子则为2i+1。
2.完全二叉树
高度为h,有n个结点的二叉树,当且仅当其每一个结点都与深度为h的满二叉树中编号1~n的结点一一对应时,称为完全二叉树,如下图。该树的特点如下:
图4 完全二叉树
(1) 叶子结点只可能在层次最大的两层上出现
(2) 若有度为1的结点,只可能有一个,且该结点只有左孩子没有右孩子
(3) 若i<=⌊n/2⌋,则i为分支结点,否则为叶子结点
(4) 按层次编号时,一旦出现某结点i为叶子结点或只有左孩子,那么编号大于i的结点均为叶子结点
(5) 若n为奇数,每个分支结点都有左右孩子;若n为偶数,则编号为n/2的结点只有左孩子,其余分支结点左右孩子都有
3.二叉排序树
二叉排序树是具有以下性质的二叉树:左子树上所有结点的关键字均小于根节点的关键字;右子树上所有结点的关键字均大于根节点的关键字。左右子树又各是一颗二叉排序树。
4.平衡二叉树
树上任一结点的左子树和右子树的深度之差不超过1。
2.2 二叉树的性质
(1)非空二叉树上叶子结点数等于度为2的结点数加1,即N0 = N2+1。
证明:设度为0、1和2的结点个数分别为N0、N1和N2、结点总数N= N0 +N1+ N2。再看二叉树中的分支数,除根节点外,其余结点都有一个分支进入,设B为分支总数,则N=B+1。由于这些分支由度为1或2的结点射出,所以B= N1+ 2N2。
于是得出N0 +N1+ N2 = N1+ 2N2+1,则N0 = N2+1。
(2)非空二叉树第K层至多有2k-1个结点(K>=1)
(3)高度为h的二叉树至多有2h-1个结点(h>=1)
(4)对完全二叉树按从上到下,从左到右的顺序编号为1,2,…,N则有以下关系:
① 当I > 1时,结点i的双亲结点编号为⌊i/2⌋
② 当2i <= N时,结点i的左孩子编号为2i,否则无右孩子
③ 当2i+1 <= N时,结点i的右孩子编号为2i+1,否则无左孩子
④ 结点i所在层次(深度)为⌊log2i⌋+1
⑤ 具有N个结点的完全二叉树的高度为⌈log2(N+1)⌉或⌊log2N⌋+1
接下来分别对二叉树的顺序存储和链式存储进行总结,分别实现二叉树的前中后序遍历的递归和非递归算法,以及层次遍历。