• 二叉排序树


    一、定义

    二叉排序树(Binary Sort Tree)又称二叉查找树二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树:

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

    (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    (3)左、右子树也分别为二叉排序树;

    首先实现二叉排序树的搜索,因为后续无论对二叉排序树进行增加、删除都要先进行查找。

    def bst_search(btree,key):
        bt=btree
        while bt is not None:
          if key==bt.value:
              return True
            elif key>bt.value:
                bt=bt.right
            else:
                bt=bt.left
        return False     
    

     如果二叉树的结构良好,其高度与树中结点个数n成对数关系,检索的时间开销为O(logn),但是如果树结构为畸形,检索的最坏时间可能达到O(n),如下图的树:

    但是如果是下面这样的结构,则平均检索时间就能达到O(logn):

    从上述两棵树而已看出,一组有序数据,是可以构建多种不同的二叉排序树,但是哪种才是最优的二叉排序树呢?从上可以看出第二颗树明显优于第一个,第二个树正是平衡二叉排序树,所以平衡二叉排序树才是最优的。

    二、平衡二叉排序树(AVL树)

     平衡二叉排序树,又叫AVL树,是由它们的发明者苏联人的名字命名的,定义如下:

    平衡二叉排序树是一类特殊的二叉排序树,它或者为空树,或者其左右子树都是平衡二叉排序树,而且其左右的子数高度之差绝对值不超过1.

    AVL树的查找平均复杂度是O(log(n))

     在每一次树插入新元素后,树的平衡都可能被破坏,需要旋转调整树的高度,以达到平衡树结构,共分为以下四种情况:

    • LL:对该结点的左儿子的左子树进行了一次插入,需右旋转
    • LR:对该结点的左儿子的右子树进行了一次插入,先左后右
    • RL:对该结点的右儿子的左子树进行了一次插入,先右后左
    • RR:对该结点的右儿子的右子树进行了一次插入,需左旋转

    旋转原则:在旋转的时候,都是要以离新插入节点最近的不平衡子树进行旋转,注意旋转的这部分子树一定是不平衡的子树。

    1)LL情况

    2)RR情况

    3)LR情况

    4)RL情况

     python代码实现参考:https://www.cnblogs.com/linxiyue/p/3659448.html?utm_source=tuicool&utm_medium=referral

  • 相关阅读:
    Studio更新
    gradle 两种更新方法
    Handler基本用法
    使用git克隆指定分支的代码
    Bugly最简单的配置方法
    setTag,getTage复用
    Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
    Android应用如何跳转到应用市场详情页面
    bzoj千题计划249:bzoj5100: [POI2018]Plan metra
    bzoj千题计划248:bzoj3697: 采药人的路径
  • 原文地址:https://www.cnblogs.com/gczr/p/10164955.html
Copyright © 2020-2023  润新知