算法学习-动态查找

1.二叉排序树查找

  将待查找数据表构造成一颗二叉排序树进行查找。

  二叉排序树定义为:若子节点不为空,则子节点树上所有节点均小余该节点;若右节点不为空,则右子树所有节点均大于该节点。

  查找过程:

  通过中序查找法,即(LDR)方式,可从二叉排序树中得到递增的有序序列。

  1.若查找树为空,则查找失败

  2.若查找树非空,将给定值KEY与查找数的根节点关键码比较。

  3.若相等,则查找成功,返回结果

     若KEY小于根节点关键码,则查找将以左节点为根的左子树继续查找,重复1,2,3.

     若KEY大于根节点关键码,则查找将以右节点为根的右子树继续查找,重复1,2,3.

  (先确定二叉树的存储结构,再考虑如何代码实现)

  插入操作:

  1.先查找在当前二叉树中,是否存在待插入KEY值

  2.若存在,则不再插入

     若不存子啊,则插入至刚刚查找到的最后节点处,按最后节点与待插入值的大小关系选择插入左侧还是右侧。

  构造二叉排序树:

  1.顺序遍历列表,将第一个数作为根节点

  2.依次将列表后续树按插入操作构造二叉树。

  删除操作:

  1.若待删除子节点为叶节点时,直接删除。

  2.若待删除子节点仅含左节点或右节点时,则将删除该节点并将相应子节点直接提上来。

  3.若待删除子节点包含左右节点时,则

    1).将右节点按LDR方式获得的第一个节点数据,提至根节点位置(待删除节点位置)。

    2).将待删除节点的左节点挂接在提上来的节点左侧。

    3).若提上来的子节点本身存在左右子节点,则将左节点挂入2)步骤左节点的按LDR方式获取的列表最右侧。将子节点右节点挂入提上来节点后的右节点按LDR方式序列的最左侧。

  性能分析:

      尽量使构造的二叉排序树左右平衡,否则性能和顺序查找一致。若平衡的二叉排序树,则性能与折半查找一致。

2.平衡二叉树(AVL树)

  左子树与右子树均为平衡二叉树的二叉排序树,称为平衡二叉树,且左子树和右子树高度之差的绝对值不超过1.

  删除,插入,构造方式类似于二叉排序树。但平衡树在经过插入,删除操作后,可能会使树失去平衡,因此需要对失去平衡的树进行调整。

  平衡化调整

  方式一:左单旋转。

    若插入的位置在平衡树中成“\”方向,则执行延逆时针方式旋转,即将根节点右子节点作为根节点。

  方式二:右单旋转。

    若插入的位置在平衡树中成“/”方向,则执行延顺时针方式旋转,即将根节点左子节点作为根节点。

  方式三:先右后左旋转。

    若插入的位置在平衡树中成“>”方向,则先执行右单旋转,再执行左单旋转。

  方式四:先左后右旋转。

    若插入的位置在平衡树中成“<”方向,则先执行左单旋转,再执行右单旋转。

 

    原文作者:查找算法
    原文地址: https://blog.csdn.net/Nnewbie/article/details/82905189
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞