学习笔记之数据结构的二叉树与红黑树

1 二叉树

特点: 一个节点的左子节点的关键字值小于这个节点,右子节点的关键字值大于或等于这个父节点
删除节点: 三种情况
    1.该节点没有子节点
        将父节点指向它的引用设置为null
    2.该节点有一个子节点
        父节点指向它的引用和它指向子节点的引用
    3.该节点有两个子节点
        注:二叉搜索树是按照关键升序排列,对每一个关键字来说,比它关键字值高的节点是它的中序后继,简称后继
        后继节点的查找: 后继节点是肯定没有左子节点的,但是可能会有右子节点
            1.从欲删除节点的右子节点开始
            2.依次跳到下一层的左子节点,直到该左子节点没有左子节点为止
        后继节点:两种情况
            1.欲删除节点的右子节点没有左子节点,那么它本身就是后继节点
            2.欲删除节点的右子节点有左子节点
遍历:
    1.前序遍历
    2.中序遍历
    3.后序遍历
    注:针对 父节点 的访问顺序而言的
平衡树:
    关键字是随机插入的,树会更趋向于平衡
非平衡树:
    特点:
        非平衡就是说树的大部分节点在根的一边
    原因:
        树的不平衡是由数据项插入的顺序造成的。如果插入顺序是升序或者降序,则所有的值都是右子节点或左子节点
    缺点:
        非平衡树的效率会严重退化

2 红黑树

解决二叉树的非平衡树的方法,它是增加了某些特点的二叉搜索树
2-1 树的平衡
能够保证更快的时间搜索一棵树,它左边的后代数量和它右边的后代数量应该大致相等
2-2 红黑规则 (遵循这些规则,树就是平衡的)
1、每一个节点不是黑色就是红色
2、根总是黑色的
3、如果节点是红色的,则它的子节点必须是黑色的,反之则不一定成立
4、从根到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点
2-3 旋转
为了平衡一棵树,需要重新手动地排列节点.进行相对于参照点的左旋或右旋
2-4 颜色变化或旋转
X表示操作的基准节点,P代表X的父节点,G代表X的父节点的父节点
2-5 外侧子孙与内侧子孙
如果X在P的一侧与P在G的一侧相同,X即为G的外侧子孙,反之,则为内侧子孙
2-6 插入
规律:
 1.默认新节点为红色
 2.查询插入点时,如遇黑色节点有两个红色子节点,则颜色变换(父节点变为红色,子节点变为黑色)
 3.第2步不会改变黑色高度,但有可能红红冲突,执行一次或两次旋转(设红色子节点为X,红色父节点为P,G代表X的父节点的父节点,旋转次数由X是G的内侧子孙还是外侧子孙决定)
 4.找到插入点之后,如P为黑色,则不需要做任何改变,直接插入
 5.如果P是红色的,则发生了红红颜色冲突
     一, 需要做两次颜色变化
     二, 如果X为G的外侧子孙,再进行一次旋转
         1.改变G的颜色
         2.改变P的颜色
         3.以G为中心进行向X上升的方向旋转
     三,如果X为G的内侧子孙,再进行两次旋转
         1.改变G的颜色
         2.改变X的颜色
         3.以P为中心向X上升的方向旋转
         4.以G为中心向X上升的方向旋转
 其他情况:
     1.假如X有一个兄弟节点S
         一:假如P为黑色,无论X有没有兄弟节点,都不需要旋转
         二:假如P为红色,,则插入之前,P不可能有一个黑色子节点(黑色高度不同)
         综上:不会出现X出现兄弟节点而且需要旋转修正的情况
     2.假如P有一个兄弟节点U
         一:如果P为黑色,X插入时不需要做任何旋转
         二:如果P为红色,则U也必为红色(否则黑色高度不同),但是在规律2中已经处理掉了
         综上:不会出现P存在兄弟节点且需要旋转修正的情况
2-7 删除
以欲删除节点在左侧的情况,如果欲删除节点在右侧,进行镜像地修正操作
2-7-1 欲删除节点: 1. 叶子节点
红色:
    特点:父节点必为黑色,必无兄弟节点
    实现:直接删除
黑色:
    特点:父节点可红可黑,必存在兄弟节点
    实现:
        1.父节点是红色,则兄弟节点必为黑色
            一:兄弟节点没有左子节点
                以P为中心向X的方向旋转
            二:兄弟节点没有左子节点
                1.以X的兄弟节点为中心,向兄弟节点的左子节点往兄弟节点旋转
                2.以P为中心向X的方向旋转
        2.父节点是黑色,则兄弟节点可红可黑
            一:兄弟节点为红色,则它必存在两个黑色子节点
                1.如果左子节点有右子节点
                    一:以兄弟节点为中心,向右旋转,并涂黑兄弟节点的左子节点的右子节点
                    二:以父节点为中心,向左旋转
                2.如果左子节点没有右子节点,只有左子节点
                    一:涂黑兄弟节点的左子节点的左子节点,涂红兄弟节点的左子节点,并以兄弟节点的左子节点为中心,向右旋转
                    二:然后执行上面的两步
                3.如果左子节点为叶子节点
                    一.涂黑兄弟节点,涂红兄弟节点的左子节点
                    二.以父节点为中心,左旋
            二:兄弟节点为黑色
                1.如果兄弟节点有右子节点
                    一:涂黑兄弟节点的右子节点
                    二:以父节点为中心,左旋
                2.如果兄弟节点无右子节点,只有左子节点
                    一:涂黑兄弟节点的左子节点,并以兄弟节点为中心,右旋
                    二:以父节点为中心,左旋
                3.如果兄弟节点既无左子节点,也无右子节点
                    一:借助欲删除节点的祖父节点及祖父节点的子树来修正
                        1.只要祖父节点与祖父节点的另一颗子树中含有红色节点,就能通过颜色变化和旋转
                        2.如果祖父节点与祖父节点的另一颗子树中的节点全为黑色,则需要借助更上层的节点,层层传递,要是还不能解决,就采取下面这种
                    二:降低黑色高度
                        缺点:子树的黑色高度降低,会影响到整棵红黑树的黑色高度,
                        1.需要同时降低右子树的黑色高度,并层层向上传递,直到根节点,最终使整棵树的黑色高度降低
                        2.但是有的右子树是无法降低黑色高度的情况,则右子树必存在红色节点,就可以通过第一步来解决 
2-7-2 欲删除节点: 2. 只有一个子节点
特点:
    该节点必为黑色,子节点必为红色(红色节点要么没有子节点,要么有两个黑色节点)
实现:
    涂黑X的子节点,并上移到X
2-7-3 欲删除节点: 3. 有两个子节点
找到X的后继结点,X与后继结点的数据交换,然后删除交换数据之后的后继结点

转:详细讲解, 有图文
数据结构之二叉树
数据结构之红黑树(一)——基础分析
数据结构之红黑树(二)——插入操作
数据结构之红黑树(三)——删除操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值