zoukankan      html  css  js  c++  java
  • 二叉排序树

    一、定义

    二叉排序树(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

  • 相关阅读:
    曾经写的一些文章,与技术无关,整理出来怀旧,:)
    在VS.NET2003中使用XHTML的插件HTML TIDY 及 MindManger
    把机器退出了域,造成无法启动 MSSQLSERVER ,晕
    hello php!
    今天又看了一下存储过程
    [转]PAGEII携手极速网爱情电影经典对白
    关键词:2005年,世乒赛.上海,乒乓的胜地
    一本SharePoint方面的书,Special Edition Using Microsoft® SharePoint Portal Server
    keo计划
    关于xp_cmdshell 。。注意安全!
  • 原文地址:https://www.cnblogs.com/gczr/p/10164955.html
Copyright © 2011-2022 走看看