1 2-3查找树
1.1概念
名称 | key个数 | 节点 |
---|---|---|
2节点(2-node) | 1 | 2 |
2节点(2-node) | 2 | 3 |
- 要么为空,要么:
- 对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的指针,
- 左节点也是一个2-3节点,所有的值都比key有小,
- 右节点也是一个2-3节点,所有的值比key要大。
- 2结点要不有两个孩子,要不就没有孩子
- 对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点。
- 左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;
- 中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;
- 右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大
- 3结点要不有3个孩子要不就没有孩子,不允许有一个或两个孩子
- 所有叶子结点都在同一层次结点
如果中序遍历2-3查找树,就可以得到排好序的序列。在一个完全平衡的2-3查找树中,根节点到每一个为空节点的距离都相同。
1.2要求
1.3操作
1.3.1插入
-
往一个2-node节点插入 往2-3树中插入元素和BST插入元素一样,首先要进行查找,然后将节点挂到未找到的节点上。 如果查找后找到的节点是一个2-node节点,只需要将新的元素放到这个2-node节点里面使其变成一个3-node节点即可
-
往一个3-node节点插入往一个3-node节点插入一个新的节点可能会遇到很多种不同的情况。
-
有3种情况
1: 只包含一个3-node节点
2:节点是3-node,父节点是2-node
1:当插入的节点是3-node的时候,将该节点拆分,中间元素提升至父节点,
2:但是此时父节点是一个3-node节点,插入之后,父节点变成了4-node节点,然后继续将中间元素提升至其父节点,
3:直至遇到一个父节点是2-node节点,然后将其变为3-node,不需要继续进行拆分。
3:节点是3-node,父节点也是3-node
1:当插入的节点是3-node的时候,将该节点拆分,中间元素提升至父节点,
2:但是此时父节点是一个3-node节点,插入之后,父节点变成了4-node节点,
3:然后继续将中间元素提升至其父节点,直至遇到一个父节点是2-node节点,然后将其变为3-node,不需要继续进行拆分。
其中有特殊情况
1:根节点分裂
当根节点到子节点都是3-node节点的时候,这是如果要在字节点插入新的元素的时候,会一直查分到跟节点,在最后一步的时候,跟节点变成了一个4-node节点,这个时候,就需要将跟节点查分为两个2-node节点,树的高度加1。
1.3.1删除
2红黑树
2.1概念
- 红黑树是一种具有红色和黑色链接的BST
- 节点是红色或黑色。
- 根节点和叶子节点(NIL节点)都是黑色。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
2.2背景
2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度。但是2-3树实现起来比较复杂。红黑树是一种简单实现2-3树的数据结构。