平衡查找树的目标是实现查找、插入、删除操作在最坏情况下的复杂度均为logN。
本节将介绍二三查找树。
二三树中有两种节点:
二节点对应一个键,有两个子节点
三节点对应两个键,有三个子节点
二三查找树非常平衡,每个空节点到根节点的距离都是一样的 。
在二三树中查找一个键的时候有以下规则:
如果是二节点,二节点对应1个值,如果要查找的值比该节点对应的值小,就往左侧深入,反之亦成
如果是三节点,三节点对应2个值,如果比两个值都小,就往左侧深入,如果介于两个值之间,就往中间深入,如果比两个值都大,就往右侧深入。
根据查找操作的规则,先定位到需要插入的节点。如果是二节点,那么将二节点中增加一个键成为三节点。如果是三节点,在三节点中增加1个键成为四节点。由于四节点不允许在二三树中出现,因此需要分解成两个二节点,并且把中间的键提取到父节点中。下图展示四节点分解的过程:
现在要在这棵树中插入一个值7
首先根据查找操作的规则定位到要插入的节点,定位之后是如图所示的节点
由于该节点是三节点,因此插入一个键,使它成为四节点
由于四节点不允许在2-3树中存在,因此需要将其分解为两个二节点,并把中间的键7提到父节点中
这样插入操作就完成了
2-3树的高度介于lgN和log_3(N)之间,因此能够保证所有的操作复杂度均在logN以下
二三树的实现非常复杂,因为要判断每个节点的类型,插入节点的时候还需要判断插入节点的位置,需要考虑的情况非常多。
算法5-1:平衡查找树之二三树,布布扣,bubuko.com
原文地址:http://blog.csdn.net/caipeichao2/article/details/30089151