zoukankan      html  css  js  c++  java
  • 数据结构选讲树的旋转(Rotation)

    摘要:

    本文讨论维护树的平衡的重要手段之一:旋转。掌握旋转是掌握高级树结构的基础。

    单旋转:

    如图:X, Y为带旋转结点,a, b, c为这两个结点的子树。图中从左到右顺序为左旋转,反之为右旋转。不难得出,旋转的关键在于处理好指针的重定向。

    于是我们容易得出旋转的过程:过程看似复杂,其实就是重新链接受旋转影响的结点的指针。以左旋转为例:

     1 void LeftRotate(BST_Node *root, BST_Node *x) {
     2 
     3     BST_Node *y = x->right;
     4     x->right = y->left;
     5     y->left->parent = x;
     6     y->parent = x->parent;
     7     if (x->parent == NULL)
     8         root = y;
     9     else {
    10         if (x == x->parent->left)
    11             x->parent->left = y;
    12         else
    13             x->parent->right = y;
    14     }
    15     y->left = x;
    16     x->parent = y;
    17 
    18     return;
    19 }

    双旋转:

    双旋转事实上就是单旋转的组合,如图:

     

    图中,先对Y结点进行了一次左旋转,使得三结点位于同一方向,然后对X结点右旋转,得到了平衡过后的三个结点。

    1 void LeftRightRotate(BST_Node *root, BST_Node *x) {
    2     
    3     LeftRotate(root, x->right);
    4     RightRotate(root, x);
    5 }
  • 相关阅读:
    mysql 常用sql操作总结
    c# 安装windows服务
    c# Ajax后台动态分页
    c# SQLHelper总汇
    C#调用Web Service时的身份验证
    c#定时调用作业
    【转】Powerdesigner逆向工程从sql server数据库生成pdm
    aspx页面@Page指令解析
    C# 简单日志文本输出
    【摘抄】C# DateTime.Now详解
  • 原文地址:https://www.cnblogs.com/rancher/p/4132910.html
Copyright © 2011-2022 走看看