二叉排序树

一、定义

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

posted @ 2018-12-23 17:40  光彩照人  阅读(10427)  评论(1编辑  收藏  举报