红黑树-旋转

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyc_csdn/article/details/80171900

此篇博客我们讨论红黑树的旋转(左旋和右旋),为了更好的理解旋转,我们只关注红黑树中关于二叉查找树部分的规则,而不关注红黑树中关于本身红黑树定义部分的规则。

  • 二叉查找树规则
    • 规则一:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 规则二:若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    • 规则三:左、右子树也分别为二叉查找树;
左旋

现有红黑树结构如下:

这里写图片描述

为了更好的理解,我们给节点X、Y、A、B和C一个值,并把要进行左旋的节点X标为红色(注意:和红黑树的红色没关系,仅仅起一个提示的作用);

这里写图片描述

我们再接着分析,此时我们需要对节点X进行左旋操作,这就意味着要以节点X为轴心,然后把节点X的右子树Y往左旋转,也就是一个上浮,结果如下:

这里写图片描述

此时左旋完毕,但是树形结构已经不符合二叉树的结构标准了,所以我们还要进行进行一步处理,也就是节点B该往哪放的问题?我们可以先试一下,如下:

这里写图片描述

这么放有问题吗?

很显然这里违背了二叉查找树的规则,尽管节点B比节点C的值要小,看似作为节点C的左子节点是正确的,但是不要忘了未旋转前,节点B是节点Y的左子节点,所以节点B的值比节点Y的值也要小,因此节点B压根就不能放在节点Y的右子树,那我们再换一种放法,如下:

这里写图片描述

扫描二维码关注公众号,回复: 2907455 查看本文章

现在我们再看一下,发现问题已经完美解决!

右旋

现有红黑树结构如下:

这里写图片描述

为了更好的理解,我们给节点X、Y、A、B和C一个值,并把要进行右旋的节点X标为红色(注意:和红黑树的红色没关系,仅仅起一个提示作用);

这里写图片描述

我们再接着分析,此时我们需要对节点X进行右旋操作,这就意味着要以节点X为轴心,然后把节点X的左子树Y往右旋转,也就是一个上浮,结果如下:

这里写图片描述

此时右旋完毕,但是树形结构已经不符合二叉树的结构标准了,所以我们还要进行进行一步处理,也就是节点C该往哪放的问题?我们可以先试一下,如下:

这里写图片描述

这么放有问题吗?

很显然这里违背了二叉查找树的规则,尽管节点C比节点B的值要大,看似作为节点B的右子节点是正确的,但是不要忘了未旋转前,节点C是节点Y的右子节点,所以节点C的值比节点Y的值也要大,因此节点C压根就不能放在节点Y的左子树,那我们再换一种放法,如下:

这里写图片描述

现在我们再看一下,发现问题已经完美解决!

总结
  1. 旋转时只需要关注二叉查找树部分的规则即可;
  2. 左/右旋就是以旋转的节点为轴心,把它的右/左子树进行上浮;
  3. 上浮之后对于中间多余的节点按照二叉查找树的规则重新放即可;
  4. 不需要死记硬背,需要旋转时自己画一画就出来了;

猜你喜欢

转载自blog.csdn.net/xyc_csdn/article/details/80171900
今日推荐