22 平衡树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
白是黑色结点,灰是红色结点
怎么把2-3-4树转换为红黑树?
用二叉树结点和颜色属性 2-结点就是二叉树结点 4-结点(A<B<C):把 中间值B作为黑结点, A、C作为红色子结点 3-结点:有两种选择
3-结点:有两种选择
反之,从红黑颜色组可以识别出2-3-4树的 结点配置情况,例如
例如
2-3-4树一种查找树, 查找过程同二叉查找树类似
2-3-4树的插入过程(构造过程)
从一个单个结点开始,直到被填满为止, 填满的意思是,该结点已经是一个包含3个 数值的4-结点了。再加入下一个元素之前, 把该4-结点先拆分成3个2-结点,其中中间 数值成为父结点,另外两个成为左右子结 点,然后再根据插入规则插入该元素
例如
插入2,15,12(上图有错) 再插入4 再插入8
再插入10
再插入25,35,55
插入11
插入9
最后插入5、7
红黑树(rbtree)
2-3-4树实现起来比较困难 红黑树的每个结点都具有颜色属性红或黑 红黑树是2-3-4树的变形,使用不同的颜色 描述3-结点和4-结点
算法与数据结构
平衡树
树的平衡 : 对于每一结点,其左右子树的 深度大体相等。 如果左右子树的深度之差的绝对值小于等 于1,就说它是平衡树
但是由于结点的位置取决于其插入的顺序, 因此有时会出现不平衡树的树,甚至退化 为链表
不平衡的树
例如向一个查找树顺序插入下列数据
比较平衡的树(同样的数据)
当替代结点是黑色时必须自底向上进行调整
红黑树类
// each node of a red-black tree is of type rbnode template <typename T> class rbnode { public: colorType color; // node's color rbnode<T> *parent; // node's parent rbnode<T> *left; // node's left child rbnode<T> *right; // node's right child T nodeValue; rbnode(const T& item, rbnode<T> *leftPtr, rbnode<T> *rightPtr, rbnode<T> *parentPtr, colorType c): nodeValue(item), left(leftPtr),right(rightPtr), parent(parentPtr),color(c){ } rbnode() { } };
向树的底层插入结点时出现连续的红色结点
双旋转
拆分4-结点时会出现连续的红色结点
ቤተ መጻሕፍቲ ባይዱ
在向下遍历的过程中,如果子树具有黑色 的父结点和两个红色的子结点,就需要拆 分该4-结点,有4种可能的情况,这时添加 新结点就会造成连续的红色结点
为了保证红黑树的特性
在拆分的过程中需要适当的转换:从颜色 翻转开始。 例如4结点的 父结点是黑色
我们期望一个树是平衡的,这样它的查找 或插入的复杂度才能保持对数级
为此要设计新的树结构,分两步走: 首先扩展一下二叉树,允许其每个结点可 以包含一个以上的数据,每个结点可以有 多于2个的子结点 2-3-4树是这种扩展的一个例子,它由一系 列具有2个、3个、4个子结点的结点组成, 是一种完美的平衡树结构,但它很难实现
因此,我们第2步 创建一种2-3-4树的特殊 表示叫红黑树(它是平衡的二叉搜索树), 通过一种简单的策略可以把2-3-4树转换为 红黑树
2-3-4树的定义
它有三种结点 ,不允许结点数值相等 2-结点 –包含一个数据A,两个指针,就 是普通的二叉搜索树的结点 3-结点 包含2个数据A<B,3个指针 4-结点 包含3个数据A<B<C,4个指针
看一个完整的例子
红黑树的性质
1 红黑树的根结点 是黑色的 2 一个红色的父结 点决不会有红色的 子结点 3 从根结点到空子 树的任意一条路径 都有相同数量的黑 色结点(这个数量 叫黑色深度)
向红黑树中添加结点
必须保证添加后仍然是红黑树 基本原则 1 维护根结点使其为黑色结点 2 新结点总是作为红色结点插入到树中,因新结 点总是插入到2-节点和3-结点中 3 无论什么时候发生了两个连续的红色结点,都 要对其旋转平衡,建立黑色的父结点 4 当向下遍历寻找插入位置时,要拆分任何4-结 点
4结点的父结点是红色时拆分的 同时还要旋转
有时要双旋转(略) 构造红黑树(插入)(充分利用前面的翻转、 平衡) (略)
从红黑树中删除结点(简介) 删除某个结点之后会破坏红黑树的性质, 因此也有进行调整 删除某个结点必须要找到能保证红黑性质 的替换结点,如果替代结点是红色,不会 影响黑色深度
使用rbtree
prog12-4
作业
书面题: