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与后继结点的数据交换,然后删除交换数据之后的后继结点
转:详细讲解, 有图文
数据结构之二叉树
数据结构之红黑树(一)——基础分析
数据结构之红黑树(二)——插入操作
数据结构之红黑树(三)——删除操作