平衡二叉树和红黑树
作者:互联网
目录
一、平衡二叉树
1. 二叉树
讲述平衡二叉树之前,先说一说二叉树。在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
2. 平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
平衡二叉树在插入的情况下会出现失衡的状态,一旦出现这种情况,就通过节点的旋转来保护树的平衡性,旋转类型分为四种:LL型、LR型、RR型和RL型。
在操作的时候,我们要先找到离造成不平衡节点最近的节点,这有利于我们旋转,旋转方式如下图所示。
但是如果节点过多的话,操作起来会很麻烦,故引入了红黑树。
二、红黑树
1. 2-3-4树
(1)简介
2-3-4树属于一种多路查找树,是一种四阶的B树,它有以下几种特点:
- 所有叶子节点都包含相同的深度;
- 节点只能是2-节点、3-节点、4-节点;
- 元素的排序整体上保持二叉查找树的特性,即父节点大于左子节点,小于右子节点;当节点有多个元素时,每个元素都必须大于他左边的和他的左子树中的元素。
(2)三种节点的示意图
- 2-节点:有2个子树的节点
- 3-节点:有3个子树的节点
- 4-节点:有4个子树的节点
(3)构建2-3-4树
2-3-4树中结点添加需要遵守以下规则:
- 插入都是向最下面一层插入
- 升元:将插入结点由 2-结点升级成 3-结点,或由 3-结点升级成 4-结点
- 向 4-结点插入元素后,需要将中间元素提到父结点升元,原结点变成两个 2-结点,再把元素插入 2-结点中,如果父结点也是4-结点,则递归向上层升元,至到根结点后将树高加1;
例题:将1 2 3 4 5 6 7 8 9 10 11 12构建成一个2-3-4树
从上面的图可知,我们是从下向上进行构建的,所以我们能够保证所有的叶子节点都拥有相同的深度。
2. 红黑树
(1)红黑树的特征
- 每个节点不是红色就是黑色
- 根节点是黑色
- 每个叶子节点(NIL节点,空节点)是黑色的
- 如果一个节点是红色的,则他的子节点必须是黑色的
- 从一个节点到该节点的所有子孙节点的所有路径上包含相同数目的黑色节点
- 特性3中的叶子节点,是只为空 (NIL或null)的节点
- 特性5,确保没有一条路径会比其他路径长两倍,因而,红黑树是相对接近平衡的二叉树。
特殊说明:我们每次新插入的节点都是红色。
原因:将插入的节点写为红色,就不会违背特性5,少违背一条特性,也就意味着我们需要处理的情况也就越少。
(2)从2-3-4树到红黑树
2-3-4树的查询操作像普通的二叉搜索树一样,非常简单,但由于其节点元素数不确定,在一些编程语言中实现起来并不方便,实现一般使用它的等同——红黑树。
至于为什么说红黑树是 2-3-4树的一种等同呢,这是因为 2-3-4树的每一个节点都对应红黑树的一种结构,所以每一棵 2-3-4树也都对应一棵红黑树,下图是 2-3-4树不同节点与红黑树子树的对应。
(3)通过2-3-4树构建红黑树
- 新插入的节点颜色为红色,这样才可能不会对红黑树的高度产生影响。
- 2-节点对应红黑树中的单个黑色节点,插入时直接成功(对应 2-节点升元)。
- 3-节点对应红黑树中的黑+红子树,插入后将其修复成 红+黑+红 子树(对应 3-节点升元);
- 4-节点对应红黑树中的红+黑+红子树,插入后将其修复成红色祖父+黑色父叔+红色孩子子树,然后再把祖父节点当成新插入的红色节点递归向上层修复,直至修复成功或遇到 root(根)节点;
如上图所示,虽然向红黑树中插入了一个新节点,但由于旋转和变色,子树的高度保持不变。
标签:黑树,结点,子树,插入,二叉树,红黑树,平衡,节点 来源: https://blog.csdn.net/qq_51774978/article/details/121609150