《算法》-3.3平衡查找树(1)

来源:互联网 发布:python 接收上传图片 编辑:程序博客网 时间:2024/06/03 12:32

3.3 平衡查找树

      理想情况下如何保持二叉树的平衡?这里引入平衡查找树。

3.3.1  2-3查找树

2-3查找树定义:

       2-节点,含有一个键(及其对应值)和两条链接,左链接指向的节点的键小于该节点,右链接指向的节点的键大于该节点;

       3-节点,含有两个键(及其对应值)和三条链接,左链接指向的节点的键都小于该节点,中链接指向的节点的键介于节点的两个键之间,右链接指向的节点的键都大于该节点;

       指向一棵空树的链接成为空链接;

3.3.1.1 查找

      将二叉树的查找算法一般化:向将要查找的节点与根节点比较,如果和任意一个相等则命中,否则根据比较结果到相应的链接(左、中、右)查找,并在其指向的子树中查找;直到最后找到空连接,则查找未命中。

3.3.1.2 向2-节点中插入新键

       先进行一次未命中查找,找到新结点将要插入的位置(某一个叶子节点的底部);

       该叶子节点是2-节点,直接将该2-节点变成一个新的含有新建的3-节点

3.3.1.3向一课只含有一个3-节点的树中插入新键

       先进行一次未命中查找,找到新结点将要插入的位置;

       将该3-节点变成一个含新键的4-节点(左键、中键、右键);

       将4-节点分解成3个2-节点:中键节点的左链接指向左键节点,右链接指向右键节点;

3.3.1.4向一个父节点为2-节点的3-节点中插入新键

       先进行一次未命中查找,找到新结点将要插入的位置;

      将3-节点变成4-节点;

      将中键节点加入到父节点2-节点中,变成3-节点,中链接指向左键节点,右链接指向右键节点;

    (插入后所有空连接到根节点的距离仍然相同,树仍完美平衡;)

3.3.1.5向一个父节点为3-节点的3-节点中插入新键

     先进行一次未命中查找,找到新结点将要插入的位置(一个3-节点);

     将要插入位置的3-节点变成4-节点;

     再用这个中间向上(父节点)构造临时的4-节点,并变换链接;

     再分解这个父节点,将它的中键插入到它的父节点中,直到遇到一个2-节点并将它替换为一个不需要继续分解的3-节点,或者达到根(根变为3-节点)。

3.3.1.6分解根节点

    如果从插入节点到根节点,一路都是3-节点,那么根节点最后变为4-节点,这时要对根节点进行分解;

    将根节点分解为3个2-节点,树高加1;

3.3.1.7局部变换

       将4-节点分解为一颗2-3树有6中情况:

     1) 根节是3-节点

     2) 父节点是2-节点,左链接指向4-节点

     3) 父节点是2-节点,右链接指向4-节点

     4) 父节点是3-节点,左链接指向4-节点

     5) 父节点是3-节点,中链接指向4-节点

     6) 父节点是3-节点,右链接指向4-节点

3.3.1.8全局性质

       上述局部变换不影响树的有序性和平衡性;

       变换前根节点到所有空连接的路径长度为h,变换后该长度仍然是h;

       只有当根节点被分为3个2-节点时,所有空连接到根节点的路径长度才会加1;