AVL(平衡二叉搜索树)的单旋转和双旋转

1.何时采用单旋转或者双旋转

单旋转:当插入点的值不介于 不满足AVL条件的树根的值 和 树根对应孩子节点的值之间;
双旋转:当插入点的值介于 不满足AVL条件的树根的值 和 树根对应孩子节点的值之间;
eg:
image
上图,插入点的值1 不介于 树根节点的值5 和 孩子节点3之间,所以采用单旋转
image
上图插入点的值47 介于 树根节点的值50 和 孩子节点45 之间,所以采用双旋转

单旋转情况分为两种:左左单旋转和右右单旋转

左左单旋转:插入点的值 小于树根节点的值和树根节点左孩子的值,只能插入在树根节点左孩子的左子树上。

旋转方案:以树根节点的左孩子为旋转轴顺时针旋转,并将左孩子的右孩子作为树根节点的左孩子。
image
上图中1小于5和3,所以采用左左单旋转。
旋转方案为:以3为轴顺时针旋转,并将轴3的右孩子4变为树根5的左孩子。

右右单旋转:插入点的值 大于树根节点的值和树根节点左孩子的值,只能插入在树根节点右孩子的右子树上。

旋转方案:以树根节点的右孩子为旋转轴逆时针旋转,并将右孩子的左孩子作为数根节点的右孩子
image
上图中6大于2和3,所以采用右右单旋转
旋转方案为:以3为轴逆时针旋转,并将轴3的左孩子4变为树根2的右孩子。

双旋转情况分为两种(但是在我看来细分可以分为4中)左右双旋转和右左双旋转

左右双旋转:细分为左右右双旋转和左右左双旋转

旋转方案:以插入点的父节点为旋转轴,先进行右右单旋转,再进行左左单旋转。
image
左右右双旋转:插入点47位于树根节点50和左孩子节点40之间,并且大于左孩子的右孩子45
旋转方案为:以插入点47的父节点45为轴逆时针旋转(采用右右单旋转的旋转方案)),再以原来的节点45为轴顺时针旋转(采用左左单旋转的旋转方案)。
image
左右左双旋转:插入点43位于树根节点50和左孩子节点40之间,并且小于左孩子的右孩子45
旋转方案为:以插入点43的父节点45为轴逆时针旋转(采用右右单旋转的旋转方案)),再以原来的节点45为轴顺时针旋转(采用左左单旋转的旋转方案)。

右左双旋转:细分为右左右双旋转和右左左双旋转

旋转方案:以插入点的父节点为旋转轴,先进行左左单旋转,再进行右右单旋转。
image
右左右双旋转:插入点57位于树根节点50和右孩子60之间,并且大于右孩子的左孩子节点55
旋转方案为:以插入节点57的父节点55为轴顺时针旋转(采用左左单旋转的旋转方案),再以原来的轴节点55逆时针旋转(采用右右单旋转的旋转方案)
image
右左右双旋转:插入点53位于树根节点50和右孩子60之间,并且小于右孩子的左孩子节点55
旋转方案为:以插入节点53的父节点55为轴顺时针旋转(采用左左单旋转的旋转方案),再以原来的轴节点55逆时针旋转(采用右右单旋转的旋转方案)
个人根据之间思路做了总结
图片来源:https://blog.csdn.net/pacosonswjtu/article/details/50522677

posted on   hold涛  阅读(462)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示