AVL(平衡二叉搜索树)的单旋转和双旋转
1.何时采用单旋转或者双旋转
单旋转:当插入点的值不介于 不满足AVL条件的树根的值 和 树根对应孩子节点的值之间;
双旋转:当插入点的值介于 不满足AVL条件的树根的值 和 树根对应孩子节点的值之间;
eg:
上图,插入点的值1 不介于 树根节点的值5 和 孩子节点3之间,所以采用单旋转
上图插入点的值47 介于 树根节点的值50 和 孩子节点45 之间,所以采用双旋转
单旋转情况分为两种:左左单旋转和右右单旋转
左左单旋转:插入点的值 小于树根节点的值和树根节点左孩子的值,只能插入在树根节点左孩子的左子树上。
旋转方案:以树根节点的左孩子为旋转轴顺时针旋转,并将左孩子的右孩子作为树根节点的左孩子。
上图中1小于5和3,所以采用左左单旋转。
旋转方案为:以3为轴顺时针旋转,并将轴3的右孩子4变为树根5的左孩子。
右右单旋转:插入点的值 大于树根节点的值和树根节点左孩子的值,只能插入在树根节点右孩子的右子树上。
旋转方案:以树根节点的右孩子为旋转轴逆时针旋转,并将右孩子的左孩子作为数根节点的右孩子
上图中6大于2和3,所以采用右右单旋转
旋转方案为:以3为轴逆时针旋转,并将轴3的左孩子4变为树根2的右孩子。
双旋转情况分为两种(但是在我看来细分可以分为4中)左右双旋转和右左双旋转
左右双旋转:细分为左右右双旋转和左右左双旋转
旋转方案:以插入点的父节点为旋转轴,先进行右右单旋转,再进行左左单旋转。
左右右双旋转:插入点47位于树根节点50和左孩子节点40之间,并且大于左孩子的右孩子45
旋转方案为:以插入点47的父节点45为轴逆时针旋转(采用右右单旋转的旋转方案)),再以原来的节点45为轴顺时针旋转(采用左左单旋转的旋转方案)。
左右左双旋转:插入点43位于树根节点50和左孩子节点40之间,并且小于左孩子的右孩子45
旋转方案为:以插入点43的父节点45为轴逆时针旋转(采用右右单旋转的旋转方案)),再以原来的节点45为轴顺时针旋转(采用左左单旋转的旋转方案)。
右左双旋转:细分为右左右双旋转和右左左双旋转
旋转方案:以插入点的父节点为旋转轴,先进行左左单旋转,再进行右右单旋转。
右左右双旋转:插入点57位于树根节点50和右孩子60之间,并且大于右孩子的左孩子节点55
旋转方案为:以插入节点57的父节点55为轴顺时针旋转(采用左左单旋转的旋转方案),再以原来的轴节点55逆时针旋转(采用右右单旋转的旋转方案)
右左右双旋转:插入点53位于树根节点50和右孩子60之间,并且小于右孩子的左孩子节点55
旋转方案为:以插入节点53的父节点55为轴顺时针旋转(采用左左单旋转的旋转方案),再以原来的轴节点55逆时针旋转(采用右右单旋转的旋转方案)
个人根据之间思路做了总结
图片来源:https://blog.csdn.net/pacosonswjtu/article/details/50522677
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步