AVL Tree(1)

AVL Tree

参考:
[1]http://www.geeksforgeeks.org/avl-tree-set-1-insertion/
[2]https://www.cyut.edu.tw/~ckhung/b/al/balst.php

一.二叉搜索树

对任意一个节点
左边的全部节点都比这个节点小
右边的全部节点都比这个节点大
这样要找一个数
就只要比较和当前节点的大小
然后选择在左子树里面找还是右子树里面找
使得搜索的时间复杂度变为logN

二.AVL树

AVL树首先满足二叉搜索树的性质
同时满足对任意一个节点 左子树的高度和右子树高度之差不大于1
这样就让二叉树的高度变小,从而使搜索次数减少
三.二叉树的旋转

            y                               x
           / \     Right Rotation          /  \
          x   T3   – – – – – – – >        T1   y 
         / \       < - - - - - - -            / \
        T1  T2     Left Rotation            T2  T3

这个旋转只是一个专有名词,并不是真正的旋转
所以初学者看的上面这个图就不知所以然了

首先y,x 是点
然机会T1 T2 T3是子树 也就是不止一个点
任何二叉树都可以这么表示

首先考虑右旋,同时假设没有T2
就是这样的图

           y
          / \
         x  T3
        /
       T1

变成这样的

        x
       / \
     T1   y
           \
           T3

这个就是右旋,很直观,把y以x为支点顺时针旋转下去
显然这样旋转是不改变二叉搜索树性质左边小右边大的性质的
如果这个树是一个图的话,就根本没改变图的结构

现在考虑T2
我们T2大哥放在哪里呢?
只能放在y的左子树了
T2比x大,比y小,所以可以放那儿
完了,这就是右旋

左旋不说了

四.AVL树的插入

AVL树核心思想就是先插
插完了看下平不平衡
这里的平衡也是一个”专有名词”
表示二叉树的左右子树的高度之差不大于1
不平衡就通过旋转调整
这样如果这个点不平衡,也就是左右子树之差大于1
那么首先就两种可能
1.左边大 叫 L型
2.右边大 叫 R型
对于这两种情况,又细分成LL,LR,RR,RL四种
第二个L,R表示是插入到这个不平衡点的子树的左边还是右边

具体图如下:

T1, T2, T3 and T4 are subtrees.
         z                                      y 
        / \                                   /   \
       y   T4      Right Rotate (z)          x      z
      / \          - - - - - - - - ->      /  \    /  \ 
     x   T3                               T1  T2  T3  T4
    / \
  T1   T2

z的高度差是2,左边高度3,右边高度1.就不平衡.
是由于新插入的点导致z不平衡的
然后新插入的点在以x为根的子树下
这样对z进行一次右旋就OK了
之后同理,具体看参考资料1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值