RBTree的插入算法
来源:互联网 发布:有价值的域名 编辑:程序博客网 时间:2024/05/20 12:47
红黑树是具有这样特性的一颗二叉搜索树。
1>每个结点不是红色就是黑色。
2>根结点是黑色。
3>如果结点为红色,其子结点必须为黑色。
4>任以结点至NULL的任何路径,所含黑结点数必须相同。
我的想法是这样的:我们要插入结点则必须找到插入的位置,然后调整平衡。只有当我们插入的结点的父结点是是红色的时候才会出现要调整的问题。
插入算法的难点主要是调整平衡的问题。我以插入结点的父结点是插入结点的祖父结点的左孩子为例进行分析,右边是左边的映射同理。由于我们要根据旋转后的图形对结点的颜色进行修改,所以插入结点的叔伯结点就显得尤为重要。
第一种情况:
图中的矩形代表结点的子树。
旋转后因为D结点的子树没有变化所以p,g结点的颜色有一个需要是黑色,来确保黑色结点的个数平衡并且在要保证左树上也有一个黑色结点。因此
x->parent->color = BLACK;
x->parent->parent->color = RED;这样才能保证旋转后的黑色结点和之前一样多。
最后进行右转。
第二种情况:
同时为确保黑色结点的个数,我们需要这样修改颜色:
x->color = BLACK;
x->parent->parent->color = RED;
最后进行先左后右旋转。
第三种情况:
D为红色所以A必须为黑色,所以为确保两个黑色结点的个数相等则
x->color = BLACK;
右旋转过后,我们要继续追溯图中p结点的父结点颜色,如果为红色则我们还需要传入p结点进行调整。
第四种情况:
同三,D为红色,则A,B必须为黑色
x->parent->color = BLACK;
先做后右旋转过后,我们要继续追溯图中p结点的父结点颜色,如果为红色则我们还需要传入p结点进行调整。
下面我展示代码:
为了方便追溯上一个结点我们进行结点类型里面加入parent指针指向结点父结点,根节点指向NULL。
如有错误之处,还请不吝赐教。
- RBTree的插入算法
- RBTree的插入算法
- RBTree的插入操作
- 红黑树(RBTree)的插入算法以及如何测试一棵树是否是红黑树?(详细图解说明)
- linux 中的rbtree算法
- rbtree原理及应用--插入
- 对RBTree的总结
- RBTree-红黑树的实现
- RBTree的模拟实现
- RBTree
- RBTree
- RBTree
- RBTree
- RBTree
- rbtree
- rbtree
- RBTree
- 红黑树(RBTree)之插入结点图解
- Java实训第4天(Java语言基础)
- HihoCoder1151 骨牌覆盖问题·二(矩阵快速幂,递推)
- 使用LM386制作Arduino音乐播放器
- 机器学习笔记之高级优化
- LintCode 151 买卖股票的最佳时机 III
- RBTree的插入算法
- ClassPathXmlApplicationContext源码解析一:准备工作
- 欢迎使用CSDN-markdown编辑器
- Qt编译问题-向导生成的helloworld都编译出错
- 2017暑假七林集训day24
- MySQL插入中文乱码
- ClassPathXmlApplicationContext源码解析二:默认空间元素解析
- ZCMU1901-LOGO
- mobilenet