树的基本术语与性质
基本概念
树是n(n≥0)个结点的有限集。
当n=0时,称为空树。
在任意一棵非空树中应满足:
1)有且仅有一个特定的称为根的结点。
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
显然,树的定义是递归的,即在树的定义中又用到了其自身,树是一种递归的数据结构。
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
1)树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
2)树中所有结点可以有零个或多个后继。
树适合于表示具有层次结构的数据。树中的某个结点(除根结点外)最多只和上一层的一个结点(即其父结点)有直接关系,根结点没有直接上层结点,因此在n个结点的树中有n-1条边。
而树中每个结点与其下一层的零个或多个结点(即其子女结点)有直接关系。
1、关于祖先、双亲、孩子、兄弟、堂兄弟,子孙结点
考虑结点K。根A到结点K的唯一路径上的任意结点,称为结点K的祖先。如结点B是结点K的祖先,而结点K是结点B的子孙。路径上最接近结点K的结点E称为K的双亲,而K为结点E的孩子。根A是树中唯一没有双亲的结点。有相同双亲的结点称为兄弟,如结点K和结点L有相同的双亲E,即K和L为兄弟。
2、结点的度、树的度
树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度。如结点B的度为2,结点D的度为3,树的度为3。
度大于0的结点称为分支结点(又称非终端结点);度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。在分支结点中,每个结点的分支数就是该结点的度。
3、结点的深度、高度和层次
结点的层次从树根开始定义,根结点为第1层,它的子结点为第2层,以此类推。双亲在同一层的结点互为堂兄弟,图5.1中结点G与E,F,H,I,J互为堂兄弟。
结点的深度是从根结点开始自顶向下逐层累加的。结点的高度是从叶结点开始自底向上逐层累加的。
树的高度(或深度)是树中结点的最大层数。图5.1中树的高度为4。
4、有序树和无序树
树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树。有序树若将子结点位置互换,则变成一棵不同的树。
注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。
5、路径和路径长度。
树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。
6、森林。
森林是m(m≥0)棵互不相交的树的集合。森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。
基本性质
解题:
度数=边数
节点数=边数+1
边数=度为1的个数1+度为2的个数2+……+度为树的度m的个数*m
n=1+度为1的个数1+度为2的个数2+……+度为树的度m的个数*m=叶子节点个数+度为1的个数+度为2的个数+……+度为树的度m的个数
二叉树的概念
定义与特性
二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。
与树相似,二叉树也以递归的形式定义。
二叉树是n(n≥0)个结点的有限集合:
1、或者为空二叉树,即n=0。
2、或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
一双树与度为2的有序树的区别:
二叉树
度为2的树至少有3个结点,而二叉树可以为空。
度为2的有序树的孩子结点是相对于另一个孩子结点的,当只有一个孩子结点时无需区分左右,而二叉树无论孩子是否为2都要确定其左右次序。
几个特殊的二叉树
满二叉树与完全二叉树
满二叉树性质:
满二叉树一定是完全二叉树。
可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为L/2向下取整,若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。
完全二叉树性质:
二叉排序树
左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。
平衡二叉树
树上任一结点的左子树和右子树的深度之差不超过1。
二叉树的性质
二叉树的存储结构
顺序存储
链式存储
二叉树的遍历与线索二叉树
先序遍历
中序遍历
后序遍历
后序遍历的非递归实现是三种遍历方法中最难的。因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题。后序非递归遍历算法的思路分析:从根结点开始,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,但是此时不能出栈并访问,因为如果其有右子树,还需按相同的规则对其右子树进行处理。直至上述操作进行不下去,若栈顶元素想要出栈被访问,要么右子树为空,要么右子树刚被访问完(此时左子树早已访问完),这样就保证了正确的访问顺序。
层序遍历
由前中后层序遍历构造二叉树
线索二叉树
二叉树在遍历时,只能从头到尾遍历。能否从一指定的节点开始遍历完整棵树?
二叉树存储时,叶子节点和只含有一个孩子的节点都有许多空链域NULL,这些地方浪费了。
所有线索二叉树就可以考虑到上述问题。在空链域存储一定的线索,线索即前驱和后继的指针,来方便遍历等操作。
中序线索化
先序线索化
后续线索化
线索二叉树找前驱后继
先序线索二叉树找不到先序前驱,因为根节点的左右孩子肯定都在根节点后面才被遍历到。
后序线索二叉树找不到先序后继,因为根节点的左右孩子肯定都在根节点前面才被遍历到。
树和森林
树的存储结构
双亲表示法
孩子表示法
孩子兄弟表示法
树、森林、二叉树的转换
树与二叉树的转换
森林与二叉树的转换
树与森林的遍历
树的遍历
森林的遍历
树与二叉树的应用
并查集
二叉排序树(BST)
别名:二叉查找树、二叉搜索树
定义
二叉排序树-查找
二叉排序树-插入
二叉排序树-构造
二叉排序树-删除
查找效率分析
平衡二叉树(AVL树)
定义
平衡二叉树-插入与调整
查找效率分析
哈夫曼树与哈夫曼编码
哈夫曼树
哈夫曼编码
哈夫曼编码可用于数据压缩。
红黑树(RBT)
红黑树来源
1、红黑树是一种自平衡的二叉查找树,是二叉查找树和平衡二叉搜索树的自然拓展。
2、递进着理解红黑树:二叉查找树->二叉平衡树->红黑树,红黑树本身是二叉搜索树,结点中增加一个颜色的属性。
3、红黑树是牺牲了严格的高度平衡的优越条件为代价。
4、它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。因此红黑树的构造和删除比AVL的简单。
5、红黑树具有良好的效率,它可在o(logn)时间复杂度内完成查找、增加、删除等操作。
6、红黑树之所以能够保持“相对平衡”,是因为有“五大约束”,满足该五大约束,二又查找树才能成为红黑树。
红黑树的基本性质(五大约束):
1、每个结点是红色或者是黑色。
2、根结点是黑色。
3、度为0和1的结点的空指针域称为空叶子,也是黑色的。
4、红色结点的孩子必须是黑色的。(即不能有连续的红色节点)
5、从根出发到所有空叶子的简单路径(不往回走)经历的黑色结点数量相等。(简称黑高)
插入过程
首先,新插入的节点都是红色的。
总结3的例子
总结4-a的例子
总结4-b的例子
总结4-c的例子
总结4-d的例子