大伙都知道平衡二叉树在插入和删除的过程中会可能会出现RR、LL、RL、LR,但头疼的是当遇到比较复杂的就判断不出来是哪一种类型。时间紧迫,下面就举一例,其它情况大伙自己尝试,这边推荐一个可视化算法网站,有助于大伙学习AVL Tree Visualzation (usfca.edu)
技巧:在每个结点的左右两边标上自身到子树的高度,标完后,从下往上找第一个被破坏的节点,然后查看该结点与插入结点的位置关系,就可以判断出是什么类型了
假设:我们依次插入1、2、3、4、5、6、7
- 插入1
- 插入2
插入2后,1的右子树高度变2,左子树高度仍然为1,没有破坏平衡
- 插入3
插入3后,2的右子树高度变2,1的右子树高度变3,平衡被破坏,可以看出,插入的结点位置(3)在是在首个被破坏的结点(1)的“右右下方”,也就是RR,只需被破坏的结点的右子树左旋即可。
- 插入4
插入4后,结点3的右子树高度变成2,结点2的右子树高度为3,平衡没有被破坏。
- 插入结点5
插入结点5后,从下往上看,发现结点(3)的右子树高度为3,左子树高度为1,首个被破外平衡的结点,查看其与插入的结点的位置关系,同上,RR,被破外平衡的结点的右子树左旋即可。
- 插入结点6
插入结点5后,从下往下看,发现结点(2)的右子树高度为4,左子树高度为2,首个被破外平衡的结点,查看其与插入的结点的位置关系,同上。
- 插入结点7
同理。