红黑树的左旋和右旋的图示
当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。
调整有两种方式【变色】和【旋转】(分为【左旋转】和【右旋转】)。变化部分比较容易理解,这儿用图示的方式说说旋转的操作。
调整【左旋】
左旋:顺时针旋转两个节点,使得自己的父节点被左孩子取代,而自己成为自己的右孩子,看不懂直接看图吧:
分析
原始状态时,一共有四个元素:
- E,根节点
- Less than E,作为左子节点。
- S,作为右子节点。
- between E and S,作为S的左子结点。
- gratter than S,作为S的右子结点。
旋转时:
E和 less than E 的连接不变,S和gratter than S的连接不变。
一、E和S两个旋转,左旋转,逆时针。
原始状态时,S作为右节点,大于等于父节点E。所以S >= E,所以S可以作为E的父节点,E作为S的左子节点。
二、S断开和between E and S
需要断开,要不断开的话,S就有三个子节点了。
三、插入between E and S节点
二叉树的插入原则是:如果搜索的值小于根节点的值,继续递归寻找根节点的左子树,如果搜索的值大于根节点的值,继续递归寻找根节点的右子树。
between E and S肯定是大于等于E,小于等于S,所以它可以作为E的右子节点和S的左子节点。原来就是作为S的左子节点,这会就插入E的右子节点好了。
如果觉得上图还是不够清晰,或者不想看动图的,下面我也画了一个静态的:
调整【右旋转】
右旋转和左旋转其实是一样的,介绍如下:
右旋:顺时针旋转两个节点,使得自己的父节点被左孩子取代,而自己成为自己的右孩子,看不懂直接看图吧:
分析
原始状态时,一共有四个元素:
- S,根节点
- E,作为左子节点。
- gratter than S,作为S的右子结点。
- Less than E,作为E的左子节点。
- between E and S,作为E的右子结点。
旋转时:
E和 less than E 的连接不变,S和gratter than S的连接不变。
一、E和S两个旋转,右旋转,顺时针。
原始状态时,E作为左节点,小于等于父节点S。所以S >= E,所以E可以作为S的父节点,S作为E的右子节点。
二、E断开和between E and S
需要断开,要不断开的话,E就有三个子节点了。
三、插入between E and S节点
二叉树的插入原则是:如果搜索的值小于根节点的值,继续递归寻找根节点的左子树,如果搜索的值大于根节点的值,继续递归寻找根节点的右子树。
between E and S肯定是大于等于E,小于等于S,所以它可以作为E的右子节点和S的左子节点。原来就是作为E的右子节点,这会就插入S的左子节点好了。
如果觉得上图还是不够清晰,或者不想看动图的,下面我也画了一个静态的:
参考
旋转的gif来自csdn
https://blog.csdn.net/chenssy