红黑树和多叉树介绍和理解

红黑树

  • 前言
    二叉搜索树的一个缺点是不平衡,当插入的数是随机数时效果很好,当插入的是有序的数时就和链表一样了,没有了插入和查询都块的特点了,这里介绍一种改进保证了二叉搜索树的平衡,当插入的是顺序也好随机也好都能保证二叉树平衡,即红-黑树,只是在原来二叉树的基础上加了一下特定的条件契约让树可以一直保证平衡。(平衡树两个叉节点数差不多,不平衡树一边有节点多一边有节点少),加入什么特性使得二叉搜索树能保持平衡呢?

  • 红黑树的规则
    1、每个节点不是红就是黑
    2、根节点总是黑的,null空节点总是黑的
    3、如果节点是红色的,那么子节点必须是黑色的。(黑色的节点子节点不一定为红黑色的)
    4、从根到子叶节点或者空节点的每条路劲,必须包含相同数量的黑节点数目
    只要遵循这些规则就能保证树是比较平衡的,那这些规则怎么会保证平衡呢?怎么理解呢?
    先看看背景
    先看看平衡树的历史,树之所以不平衡是因为高度又差,当一边的高度低一边的高度高时就是不平衡树,查找的效率就降低,所以解决办法就是想办法让树保持高度一致,导致高度差的步骤即为当插入时插入的位置不对比如下图1,如果插入15则像图2一样,树边得不平衡了,说明某一个节点大了或者小了,如果某一个节点过大的话会导致插入的节点大部分或者全部都比它小就会全部进入左子树,这样子左子树节点数比右子树节点数多,就会使树失去平衡左边长右边短和下图一样,若某节点过小则类比会使右子树太高左子树太矮失去平衡,比如下图说名某节点数值过大了导致插入的节点往左子树插入太多导致树不平衡,这种情况出现的话想办法调节一下过大节点的值即可使树达到平衡,从插入后的树进行调节,又不敢轻易调节太多不然失误更大,所以从底部一步一步的调节,显然30这个节点已经过大了,因为过大所以才导致21插入时在左边,而21又比15大所以才导致了15一直往左节点放才使树不平衡,所以调节30这个节点值过大了,所以取一个比它小的节点来取代它的位置,多小呢要子节点的最小嘛不行这样子所有子节点都会放右子树又不平衡,所以取相邻的一步一步来,这里取21取代,那21的子树怎么安置呢,30又怎么安置呢,30肯定往21的右子树放,21的子树左的仍然是左,右的插入右边,这就是右旋转的过程和来源,旋转后发现左子树变短了一节,但是右子树又变长了,还是不平衡,说明45那个节点的值过大了导致插入的节点到左子树过多了,再次对45节点进行同理调整即可平衡,旋转不会超过两次就能平衡(想象一下旋转整个过程就明白),这就是旋转解决不平衡的思路。从直观角度来说旋转就是使一些节点上升一些节点下降使得树平衡
    简言之,左边太高说明节点过大,进行向右旋转,右边太高说明节点过小,进行向左旋转
    在这里插入图片描述
    在这里插入图片描述
    知道怎么调整不平衡树了怎么半段树不平衡呢,我们画出来很显然,但是程序可不能看,前一个解决方案是,AVL树,在节点再保存一个数据保存该节点左右子树的高度差,当高度差超过1时就表示不平衡,则进行旋转调整,这种方法容易理解而且查找也还有效率但是问题就是这个平衡的过程插入后不和就要旋转,之后要向上扫描平衡,就是说插入后可能上面的节点的左右高度差就变了要向上检查插入路径上所有节点保证高度差的正确性。
    红黑树怎么保证平衡呢,AVL方便容易想到但是插入效率低而且麻烦,还有没有一种机制可以不用每次插入都要往上检查就可以保证高度差不会太大以至于导致树不平衡呢?,科学家们想到了一种巧妙交错的办法,就是黑白交错,如果一棵树上所有节点都只有两种状态黑白,并且黑白交错,那么如果所有路径的黑节点数都相同那么每个路径相差不会超过一个,因为黑白交错,要么红的和黑的一样要么比黑的多一个节点,

  • 重复关键字的问题
    当有重复关键字时,只有将相同关键字一个放左边一个放右边才能使树平衡,当具有相同关键字时需要特殊处理。

多叉树

多叉树就是含有多个数据项,而且除了叶子节点其他的必须含有比数据项多一个节点,每个节点的所有数据大小在对应数据项之间,这些规则都是为了保证树的平衡,如图
在这里插入图片描述
当遇到满节点时需要分裂,分裂的思路大致是,将满节点的数据项中间值取出来然后分两半,分出的来的两边组成两个子树,然后接在取出来的数据项的两边,如果是根节点分裂取出来的节点即为新的根节点,如果不是根节点,取出来的数据项项加入父节点。也就是说除了叶子节点,其他节点都是从子节点分裂取出来的数据项慢慢填满的。如图
在这里插入图片描述

理解

和红黑树一样的思路,红黑树树判断某一边过大的思路是某一边的黑节点数过多也就是太长了,说明相应的父节点过于大或者小,导致每次插入都一直往它的子节点放而不是放另外一边,导致自己过长也就是树不平衡。多叉树也是一样,当某一节点满节点时,说明该节点的数据项分布不合理导致会有数据一直插入该节点的子节点所以才会满节点,所以就取中间出来,让它合理一些分布。而且因为多叉树是往上加层的,也就是不会往下面增加层数,天然的平衡树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值