1、树的基本概念

深度:计算一个节点的深度,从根节点算起(记住从1开始计数),到该节点所经过的节点数。

高度:计算一个节点的高度,从叶子节点算起(记住从1开始计数),到该节点所经过的节点数。

节点的度:树的度是如下定义的:有根树T中,结点x的子女数目称为x的度。也就是:在树中,结点有几个分叉,度就是几。

一个有用的小公式:树中结点数 = 总分叉数 +1。(这里的分叉数就是所有结点的度之和)

以上概念虽然不难理解,但是需要非常熟练的记住,因为在后续分析其他类型的树,经常会遇到术语,看到之后再去查,总不如记住的好。

 

2、遍历

树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。

如图所示二叉树:

https://images2015.cnblogs.com/blog/818789/201601/818789-20160103155349479-2002367351.png

 

 

前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回。

 

前序遍历的规则:

1)访问根节点

2)前序遍历左子树

3)前序遍历右子树

 

这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成。

前序遍历的输出结果:ABDECF

 

中序遍历:中序遍历可以记为左根右,也就是说在二叉树的遍历过程中,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。

同样,在二叉树为空的时候,结束返回。

 

中序遍历的规则:

1)中序遍历左子树

2)访问根节点

3)中序遍历右子树

 

注意:在完成第13步的时候,要按照中序遍历的规则来完成。

中序遍历的输出结果: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个结点的二叉树的高度至少为log2n+1

性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

 

 

3.2满叉树

         高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树,用人话说,把所有坑占满的二叉树,就是满二叉树。

 

根据满二叉树的定义,得到其特点为:

  1. 叶子只能出现在最下一层。
  2. 非叶子结点度一定是2.
  3. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。

 

3.3完全二叉树

对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。满二叉树必须是完全二叉树,反过来不一定成立。

用人话说,就是把所以节点从左往右,按照满二叉树的规则填坑,填好了就是完全二叉树了。

 

结合完全二叉树定义得到其特点:

  1. 叶子结点只能出现在最下一层(满二叉树继承而来)
  2. 最下层叶子结点一定集中在左 部连续位置。
  3. 倒数第二层,如有叶子节点,一定出现在右部连续位置。
  4. 同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。

 

3.4二叉查找树

定义:二叉查找树又被称为二叉搜索树。设x为二叉查找树中的一个结点,x结点的值计为key[x]。如果yx的左子树中的一个结点,则key[y]<=key[x];如果yx的右子树的一个结点,则key[y]>=key[x]

在二叉查找树种:

1)任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。

2)任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。

3)任意结点的左、右子树也分别为二叉查找树。

 

3.5 红黑树

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 

红黑树性质

红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下五条性质 
红黑树需要满足的五条性质: 
性质一:节点是红色或者是黑色; 
在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。 
性质二:根节点是黑色; 
根节点总是黑色的。它不能为红。 
性质三:每个叶节点(NIL或空节点)是黑色; 
这个可能有点理解困难,可以看图 

这个图片就是一个红黑树,NIL节点是个空节点,并且是黑色的。 
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点); 
就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。

性质五:从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点

注意
(01) 特性(3)中的叶子节点,是只为空(NILnull)的节点。
(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)每个结点的结构为:

nk1k2...kn
p0p1p2...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+树

。。。

https://www.sohu.com/a/156886901_479559

https://www.cnblogs.com/vincently/p/4526560.html

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值