概述
本章内容通常以选择题
的形式考察,但不排除会有算法题涉及树的遍历
1、树的基本概念
树的定义是递归的
,是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层的结构
树中的某个结点(除根结点外)最多只和上一层的一个结点(即其父节点)有直接关系
;树中的每个结点与其下一层的零个或多个结点(即其子女结点)有直接关系
具有 个结点的树中有 条边
基本术语
祖先结点
、子孙结点
双亲结点
、孩子结点
兄弟结点
结点的度
:树中一个结点的子结点个数
树中结点的最大度数称为树的度
度大于0的结点称为分支结点(或非终端结点)
度为0(没有子女结点)的结点称为叶子结点(或终端结点)
在分支结点中,每个结点的分支数就是该结点的度
结点的层次
、结点的深度
、结点的高度
树的高度(又称深度)
是树中结点的最大层数
有序树和无序树:树中结点的子树从左到右
是有次序的,不能交换,这样的树叫做有序树
。有序树中,一个结点其子结点按从左到右顺序出现是有关联的。反之则称为无序树
树中两个结点之间的路径
是由这两个结点之间所经过的结点序列
构成的,而路径长度
是路径上所经过的边数的个数
树中的分支是有向的
,即路径是从上向下的
。同一双亲结点的两个孩子结点之间是不存在路径的
森林
是
棵互不相交
的树的集合
树具有如下最基本的性质(不要死记公式,自己推导更快):
- 1、树中的结点数等于所有结点的度数加1
- 2、度为 层上至多有 个结点
- 3、高度为 叉树至多有 个结点
- 4、具有
叉树的最小高度为
(
向上取整
)
相关习题
树的路径长度
是从树根到每一结点的路径长度的总和
树根到每一结点的路径的最大值应该是树的高度减1(个人觉得这个结论不对)
经常用到的性质是显而易见的,理解
就可以了,不必强行记忆
2、二叉树的概念
二叉树
:其每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒
二叉树是有序树
,即使树中结点只有一棵子树,也要区分它是左子树还是右子树
二叉树与度为2的有序树
的区别:
- 1、度为2的树至少有3个结点,而二叉树可以为空
- 2、度为2的有序树的孩子结点的左右次序是相对于另一孩子结点而言的;二叉树的结点次序不是相对于另一结点而言,而是确定的
几个特殊的二叉树:满二叉树
、完全二叉树
、二叉排序树
、平衡二叉树
满二叉树:高度为 ,含有 个结点的二叉树
满二叉树中编号(自上而下,自左向右)为
的结点,如果有双亲,其双亲为
(向下取整
),如果有左孩子
,则左孩子为
,如果有右孩子
,则右孩子为
完全二叉树:和满二叉树相对应,其有很多有意思的性质(通过理解,自己推导)
二叉排序树:
平衡二叉树:树上任一结点
的左子树和右子树的深度之差不超过1
二叉树的性质:
- 1、非空二叉树上
叶子结点数
等于度为2的结点数
加1,即 - 2、
- 3、
- 4、(
完全二叉树
)结点 所在层次为 (前一个结果向下取整
后加1) - 5、具有
个结点的
完全二叉树
的高度为 (向上取整),上面的公式也可以用于该计算
二叉树的存储结构
顺序存储:
完全二叉树和满二叉树
采用顺序存储比较合适,树中结点的序号可以唯一地
反映出结点之间的逻辑关系,同时也最大可能地节省了存储空间
一般的二叉树不适合采用顺序存储结构
所有树的顺序存储结构都应该从数组下标1开始存储
树中的结点(否则会带来一些问题)
对于一般二叉树
来说,顺序存储结构对空间的利用率较低,因此,一般二叉树都采用链式存储结构
(二叉链表)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
含有
个结点的二叉链表中含有
个空链域
,可以利用空链域来组成线索链表