1.树的定义
树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:
1)有且仅有一个特定的称为根的结点。
2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
1)树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
2)树中所有结点可以有零个或多个后继。
因此n个结点的树中有n-1条边。
2.基本术语
1)祖先:如结点G,根A到结点G的唯一路径上的任意结点称为G的祖先,如,A,B,D;
子孙:同理,结点G也可称为A,B,D的子孙;
双亲:如结点G,路径上最接近结点G的结点D称为G的双亲;
孩子:G则可称为D的孩子;
兄弟:有相同双亲的结点称为兄弟,如G,H,I具有共同的双亲D,即G,H,I称为兄弟;
堂兄弟:双亲在同一层的结点称为堂兄弟,如D,E,F的双亲B和C在同一层,即D,E,F称为堂兄弟;
2)树中一个结点的孩子的个数称为该结点的度,如A的度为2,B的度为1,D的度为3;
树的度:树中结点的最大度数,如上图中树的度为3;
3)分支结点(又称非终端结点):度大于0的结点;
叶子结点(终端结点):度为0的结点,即没有子女的结点;
在分支结点中,每个结点的分支数就是该结点的度;
4)结点的层次,从树根开始定义,根在第一层,它的子结点为第二层,如上图A在第一层,B,C在第二层,D,E,F在第三层,G,H,I,J在第四层,
结点的深度:从根节点开始自顶向下逐层累加;
结点的高度:从叶结点开始自底向上逐层累加;
树的高度:树中结点的最大层数;
5)有序数:树中结点的各子树从左到右是有次序的,不能交换;反之则为无序树;
6)路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成;
路径长度:路径上所经过的边的个数;
7)森林:森林是m(m>=0)棵互不相交的树的集合;
3.树的性质
1)树中结点数等于所有结点的度数和加1,设度为0的结点数为n0,度为1的结点数为n1,……,度为i的结点数为ni,结点数 n = 0*n0+1*n1+...+i*ni;
2) 度为m的树中第i层上至多有个结点(i>=1)
3) 高度为h的m叉树至多有个结点(等比数列前n项和)
4)具有n个结点的m叉树的最小高度为 向上取整;
T1.树的路径长度是从树根到每个结点的路径长度的总和;
根到每个结点的路径长度的最大值应该是树的高度减1;
T2.在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T中叶结点的个数为( 82 );
解:根据树的性质1)可知树T的结点数 n = 4*20+3*10+2*1+1*10+1 = 123;
分支结点的个数(即度不为0的结点的个数) m = 20 + 10 + 1 +10 = 41;
叶结点的个数为 n - m = 82;
4.二叉树的定义
二叉树是一种有序树,若将其左右子树颠倒,则变成另一棵不同的二叉树,其特点是每个结点至多只有两棵子树(即二叉树的度不超过2,可以为1或者0)
二叉树和度为2的有序树的区别:
① 度为2的树至少有3个结点,而二叉树可以为空;
② 度为2的有序树的孩子的左右次序是相对于另一孩子而言的,若某个结点只有一个孩子,则这个孩子就无需区分其左右次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,即二叉树的结点次序是确定的,而不是相对的;
几种特殊的二叉树:
1)满二叉树:一棵高度为h,且含有个结点的二叉树,称为满二叉树,如下图:
对于编号为 i 的结点,若有双亲,则其双亲为 i/2( 向下取整),若有左孩子,则左孩子为2i,
若有右孩子,则右孩子为 2i+1 ;(注意先决条件为若有,也可能没有)
T3.结点按完全二叉树层序编号的二叉树中,第 i 个结点的左孩子的编号为2i (√ ×)
错误 , 第 i 个结点不一定有左孩子;
2)完全二叉树:高为h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1-n的结点一一对应时,称为完全二叉树,如下图:
① 若i<=n/2,则结点i为分支结点,否则是叶子结点;
② 叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;
T4.已知一棵完全二叉树的第六层(设根为第一层)有8个叶结点,则该完全二叉树的结点的个数为多少? 答:39 或 111
解:两种可能
第一种 第六层为最后一层,则结点数为
第二种 第六层为倒数第二层 第六层有 2^5(32)个结点 ,8个叶子结点,则24个分支结点,因此第七层有24*2=48,则总结点个数为 2^6-1+48 = 111个结点
③ 若有度为1的结点,则只可能有一个(即,完全二叉树最多只有一个度为1 的结点),且该结点只有左孩子而无右孩子;
T5.一棵有124个叶子结点的完全二叉树,最多有(248)个结点
解:完全二叉树具有度为2的结点,度为1的结点,度为0的结点,其中度为1的结点有1个或者0个(看下一条性质)
第一种可能,设该完全二叉树有n2个度为2的结点,1个度为1的结点,总结点为n
由树的性质1)可知n = 1 + 2*n2 + 1;又 n = 124 + 1 + n2 ; 解得n2 = 123
n = 248;
第二种可能,设该完全二叉树有n2个度为2的结点,0个度为1的结点,总结点为n
n = 2*n2 + 1 ; n = 124 + n2; 解得 n = 247;
因此,最多有248个结点
④ 按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点;
⑤ 若n为奇数,则每个分支结点都与左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点左右孩子都有;
3)二叉排序树:左子树上所有的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;右子树和左子树又各是一棵二叉排序树。
4)平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。
5.二叉树的性质
1)非空二叉树上的叶子结点树等于度为2的结点数+1,即
若结点的数量为n,则边的数量为n-1 ;
2)非空二叉树上第k层上最多有个结点(k>=1)
3)高为h的二叉树至多有个结点(h>=1)
4)对于完全二叉树按从上到下,从左到右的顺序依次编号1,2,3,...,n(注意是从1开始),则有以下关系:
① 当i>1时,结点i的双亲编号为i/2(向下取整),即 i 偶数 双亲 i/2,左孩子 , i 奇数 双亲 (i-1)/2 右孩子
② 当2i<=n时,结点i的左孩子结点为2i,否则无左孩子;
③ 当2i+1<=n时,结点i的右孩子编号为2i+1,否则没有右孩子;
④ 结点i所在层次为 (向下取整)
5)具有n(n>=0)个结点的完全二叉树的高度为(向下取整),易求;
6.二叉树的存储结构
1.顺序存储结构
二叉树的顺序存储是指用一组地址连续的存储单元依次自上而下,自左向右存储所有二叉树上的结点元素,如下图:
依据二叉树的性质,完全二叉树和满二叉树采用顺序存储较为合适,树中结点的序号可以唯一的反映结点之间的逻辑关系,这样既能最大可能地节省存储空间,又能利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系;但是最坏情况下,高为h的且只有h个结点的单支树,却要占据近个存储单元。
上图这种存储结构建议从数组下标为1开始,若从0开始,则需要重新考虑性质4
2.链式存储结构
由于顺序存储利用效率较低,因此二叉树一般采用链式存储结构;
二叉链表至少包含3个域:数据域,左指针域和右指针域
//二叉树链式存储结构
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
在含有n个结点的二叉链表中,含有n+1个空链域(也叫空指针)
T6.设二叉树有2n个结点,且m<n,则不可能存在(C)的结点
A . n个度为0 B.2m个度为0 C.2m个度为1 D.2m个度为2
解:设度为0的结点数为n0,度为1的结点数为n1,度为2的结点数为n2
2n = n1 + 2 * n2 + 1;观察发现 n1应为奇数故 C选项有2m个度为1 的结点错误;
T7.一棵高度为h的满m叉树有如下性质:根结点所在层次为第一层,第h层上的结点都是叶结点,其余各层上每个结点都有m棵非空子树,若按层次自顶向下,同一层自左向右,顺序从1开始,对全部结点进行编号,试问:
(1)各层的结点个数是多少?
(2)编号为 i 的结点的双亲结点(若存在)的编号是多少?
(3)编号为 i 的结点的第k个孩子结点(若存在)的编号是多少?
(4)编号为 i 的结点有有右兄弟的条件是什么?其右兄弟结点的编号是多少?