1、树的基本概念
深度:计算一个节点的深度,从根节点算起(记住从1开始计数),到该节点所经过的节点数。
高度:计算一个节点的高度,从叶子节点算起(记住从1开始计数),到该节点所经过的节点数。
节点的度:树的度是如下定义的:有根树T中,结点x的子女数目称为x的度。也就是:在树中,结点有几个分叉,度就是几。
一个有用的小公式:树中结点数 = 总分叉数 +1。(这里的分叉数就是所有结点的度之和)
以上概念虽然不难理解,但是需要非常熟练的记住,因为在后续分析其他类型的树,经常会遇到术语,看到之后再去查,总不如记住的好。
2、遍历
树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。
如图所示二叉树:
前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回。
前序遍历的规则:
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树
这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成。
前序遍历的输出结果:ABDECF
中序遍历:中序遍历可以记为左根右,也就是说在二叉树的遍历过程中,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。
同样,在二叉树为空的时候,结束返回。
中序遍历的规则:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
注意:在完成第1,3步的时候,要按照中序遍历的规则来完成。
中序遍历的输出结果:DBEAFC
后序遍历:后序遍历可以记为左右根,也就是说在二叉树的遍历过程中,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,最后访问根节点。
在二叉树为空的时候,结束返回。
后序遍历二叉树的规则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
注意:在完成1,2步的时候,依然要按照后序遍历的规则来完成。
后序遍历的输出顺序:DEBFCA
3、各类树
最开始是先想了解B树,看到资料说B树是从2-3树扩展而来,而2-3树又是从二叉查找树扩展,二叉查找数又是一种二叉树,所以循序渐进就从二叉树开始看。
二叉树----满二叉树-----完全二叉树---二叉查找树----红黑树----2-3树-----B树---B+树。
个人人为红黑树插入和删除最难理解,绕的很,到现在没还没看到哪篇帖子讲的特别明白,还需要慢慢摸索。
3.1 二叉树:
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
2、二叉树的性质
性质1:二叉树第i层上的结点数目最多为2(i-1)(i>1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为log2(n+1)
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
3.2满叉树
高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树,用人话说,把所有坑占满的二叉树,就是满二叉树。
根据满二叉树的定义,得到其特点为:
- 叶子只能出现在最下一层。
- 非叶子结点度一定是2.
- 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。
3.3完全二叉树
对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。满二叉树必须是完全二叉树,反过来不一定成立。
用人话说,就是把所以节点从左往右,按照满二叉树的规则填坑,填好了就是完全二叉树了。
结合完全二叉树定义得到其特点:
- 叶子结点只能出现在最下一层(满二叉树继承而来)
- 最下层叶子结点一定集中在左 部连续位置。
- 倒数第二层,如有叶子节点,一定出现在右部连续位置。
- 同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。
3.4二叉查找树
定义:二叉查找树又被称为二叉搜索树。设x为二叉查找树中的一个结点,x结点的值计为key[x]。如果y是x的左子树中的一个结点,则key[y]<=key[x];如果y是x的右子树的一个结点,则key[y]>=key[x]。
在二叉查找树种:
(1)任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
(2)任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
(3)任意结点的左、右子树也分别为二叉查找树。
3.5 红黑树
红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。
红黑树性质
红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下五条性质
红黑树需要满足的五条性质:
性质一:节点是红色或者是黑色;
在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。
性质二:根节点是黑色;
根节点总是黑色的。它不能为红。
性质三:每个叶节点(NIL或空节点)是黑色;
这个可能有点理解困难,可以看图 ;
这个图片就是一个红黑树,NIL节点是个空节点,并且是黑色的。
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点);
就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。
性质五:从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
红黑树的左旋和右旋
红黑树的删除和添加
本人理解能力不好,对于红黑树的删除和添加理解的非常吃力,如果哪位大神能深入浅出的解释一番,那真是大公德。
3.6 2-3树
2-3直接看帖子,已经是解释的很详细了。
https://blog.csdn.net/hello_world_lvlcoder/article/details/72615092
3.7 B树
B-树中所有结点中孩子结点个数的最大值成为B-树的阶,通常用m表示,从查找效率考虑,一般要求m>=3。一棵m阶B-树或者是一棵空树,或者是满足以下条件的m叉树。
1)每个结点最多有m个分支(子树);而最少分支数要看是否为根结点,如果是根结点且不是叶子结点,则至少要有两个分支,非根非叶结点至少有ceil(m/2)个分支,这里ceil代表向上取整。
2)如果一个结点有n-1个关键字,那么该结点有n个分支。这n-1个关键字按照递增顺序排列。
3)每个结点的结构为:
n | k1 | k2 | ... | kn |
---|---|---|---|---|
p0 | p1 | p2 | ... | pn |
其中,n为该结点中关键字的个数;ki为该结点的关键字且满足ki<ki+1;pi为该结点的孩子结点指针且满足pi所指结点上的关键字大于ki且小于ki+1,p0所指结点上的关键字小于k1,pn所指结点上的关键字大于kn。
4)结点内各关键字互不相等且按从小到大排列。
5)叶子结点处于同一层;可以用空指针表示,是查找失败到达的位置。
如果B-树的阶数为m,则结点中关键字(也就是值)的个数的范围为ceil(m/2)-1 ~ m-1个。
觅得一处好帖也是好的
https://blog.csdn.net/qq_35644234/article/details/66969238
http://www.cainiaoxueyuan.com/suanfa/4547.html
3.8 B+树
。。。