(个人在学习2-3树时的一些深入思考,对比了AVL树,在想为何创造了2-3树,逻辑可能不请,个人笔记,还请谅解)
首先2-3树有一个前提:对于2-3树结点的每次添加,永远不会添加到空位置上.
个人对此前提的理解:
2-3树的设计理念我认为是每个结点添加满三个值时再进行处理,因为一点满足该结点存满了3个值则可立即对这3个数进行比较,看谁是中间数,即哪个值应该放在中间位置,对这3个数排序找出该中间值将其输送到父节点,从而产生一个向该子树方向的竞争力量(或左,或中,或右)
该竞争力量可对最终根节点值的确定起到一定的决定作用(即将根节点值向值多的那颗子树方向拉扯,让其值与数值多的那颗子树贴近),最终把根节点的值约束在一组数据的近似中间位置
如对左子树而言,若左子树满3个值的结点的数量多于其他方向的子树,则从左子树向根节点输送的结点数多于其他子树向根节点输送的结点数(证明该组数据中小于初始根节点的值的结点数目多),则根节点最终的值会向左子树结点的数值靠拢,即也向该组数据的中间值靠近。若初始根节点定的恰好为该组数据中间值附近的值,则在添加节点时,各子树几乎会轮流产生竞争力量,对根节点的值的个方向拉扯力量趋于相等,则最终根节点值几乎不会发生变化。
满3个结点便进行转化其实就是AVL的自平衡旋转,若一个结点中存放数<=2则对应于AVL树中只存在两种情况,此情况左右子树深度差<=1一定平衡,只有一个结点中存的值>=3个时才会出现非平衡现象
,除情况1外都不平衡,这时AVL树即2-3树进行的处理操作均为找三个值的中间值作为父节点,其他两个值作为左右子树,即2-3树的满3值进行转化的思想和AVL满3结点非平衡状态的自平衡旋转思想相同。
一个例子: