直接进入正题:

一、如何从数组生成一个二叉树

假设数组为:{ 30, 13, 7, 43, 23, 12, 9, 33, 42, 21, 18, 6, 3, 50 },我们不对数组排序,直接生成二叉树。

创建流程:

1.将第一数作为根节点:

2.插入13,13小于30,放在30的左边子节点。

 

3.插入7,7小于30,7小于13,放在13的左边子节点。

4.插入43,43大于30,放在30的右边子节点。

5.放入23,23小于30,23大于13,放入13的右边子节点。

6.放入12,12小于30,12小于13,12大于7,放入7的右边子节点。

7.放入9,9小于30,9小于13,9大于7,9小于12,放入12的左边子节点。

8.中间省略,最后生成的二叉树为如下:

9.由上图可以看出,普通二叉树是不平衡的,最坏的情况可能会形成以下情况:

在这种情况下,当我们需要查找1的时候,时间复杂度就是O(n)。

普通二叉树的查找时间复杂度为[O(log2n),O(n)]之间。如果让其始终保持为O(log2n)的时间复杂度呢,我们就要创建平衡二叉树。

2-3树和红黑树都是平衡二叉树,我们先看2-3树,然后再由2-3树引出红黑树的原理。

 

二、平衡二叉树 2-3树

2-3树的意思就是,某个节点有两种可能:

一是正常的2-节点,包含一个值(或键),包含左右两个子节点。二是3-节点,包含两个值,包含左中右三个子节点。

如图所示:

左边为2-节点,右边为3-节点。

 

向一个2-3树的节点中插入一个新的元素有以下几种基础操作:

1.插入一个比2-节点值小的元素,例如对值为30的2-节点插入20:

2.插入一个比2-节点值大的元素,例如对值为30的2-节点插入40:

 

3.插入一个比3-节点左边值更小的值,例如对值为20 30的3-节点插入15:

注意,这里对3-节点插入数据后,形成了一个4-节点,可以分解为最右边的二叉子树。

4.插入一个比3-节点左边值更大、比右边值更小的值,例如对值为20 30的3-节点插入25:

5.插入一个比3-节点右边值更大的值,例如对值为20 30的3-节点插入40:

 

6.当下面一层的元素形成了4-节点,将4-节点的中间数往上层升级(分左右方向):

 

 

有了上述6个基本操作,我们开始使用前面的数组来创建2-3树:

数组为{ 30, 13, 7, 43, 23, 12, 9, 33, 42, 21, 18, 6, 3, 50 }。

创建流程:

1.将30作为根节点。

2.插入13,13比30小,形成一个值为13 30的3-节点。

3.插入7,7比13小,形成一个值为7 13 30的4-节点,然后分解。

4.插入43,43大于13,43大于30,与30一起形成3-节点。

5.插入23,23大于13,23小于30,与30 43形成4-节点,然后分解。

 

6.插入12,12小于13,12大于7,与7组成3-节点

 

7.插入9,9小于13,9大于7,9小于12,与7 12组成4-节点,然后分解。分解后9升级到上一层,与13 30形成4-节点,再次分解。

8.插入

 

版权声明:本文为leokale-zz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/leokale-zz/p/11123482.html