AVL tree 记忆

来源:互联网 发布:word表格数据排序 编辑:程序博客网 时间:2024/05/21 06:35

以前学的时候就迷迷糊糊,凑合就过去了。

今天做PAT一道题要实现AVL tree。。对着题弄了半天愣是没弄出来。

左旋右旋倒是都记得,只要看过图或者动画就很清晰明了,随便回想一下就记起来了。

关键是LL,LR,RL,RR四种情况的具体判断,以前没仔细抠,实现的时候才发现想不起来具体的判断标准了。。。


可能是被PAT题里的图误导了,没有注意到真正的判断标准。。

实际上区分四种情况的判断标准是:


从新插入处向上溯,找到第一个不符合AVL定义的平衡点,也就是其左右子树高度差大于一。方便起见,称为root。 (该点处理完后,取决于实现,可以继续上溯)

然后看,新插入的点,属于root的左子树的左子树,还是什么,共计四种情况,简称LL,LR,RL,RR。


注意判断标准,只是看属于root的左子树的左子树,这两层子树。其他的无关紧要的都不用管。比如说新加入点有多深,一路上是不是光秃秃的,还是枝繁叶茂,还是怎么着。全都没关系。

死抠上面那个标准就行。


看新加入节点属于哪两层子树,其实等价于看插入后root的左右子树哪个高(不平衡了,肯定能比出来),再看这个子树的左右子树哪个高(也肯定能比出来,如果比不出来,说明之前就不平衡了)。


但是实现上还是用新加入值和root的左右子树值比较,判断一层,再和该子树的左右比,再判断一层,比较干净利落。


因为可以用递归,递归退出的时候,自动是从插入处向上回溯的,所以代码也可以比较干净。

比如说下面两位写的,讲的都很清楚,代码也很好

http://www.cnblogs.com/skywang12345/p/3576969.html

http://dongxicheng.org/structure/avl/


几个小变种,

有用平衡因子代替高度的。

有再上溯过程中注意是否以上都没变化的。


原创粉丝点击