zoukankan      html  css  js  c++  java
  • 红黑树插入代码学习

    算法导论的伪代码的注释看的很晕啊,网上找到代码,研究下:

    代码
    void rb_tree_insert(rb_tree * &T, int value)
    {
    rb_tree
    *z = new rb_tree();
    z
    ->data = value;//即将插入的节点
    rb_tree *y = nil;
    rb_tree
    *x = T;
    while (x != nil)
    {
    y
    = x;
    if(x->data > z->data)
    x
    = x->left;
    else
    x
    = x->right;
    }
    z
    ->parent = y;
    if(y == nil)
    T
    = z;
    else
    {
    if (z->data < y->data)
    {
    y
    ->left = z;
    }
    else
    {
    y
    ->right = z;
    }
    }
    z
    ->left = z->right = nil;
    z
    ->color = red;
    }

    rb_tree
    * rb_insert_fixup(rb_tree *T, rb_tree *z)
    {
    rb_tree
    *y = NULL;
    while(z != T && z->parent->color == red)//z不是根节点而且父节点为红
    {
    if (z->parent == z->parent->parent->left)//父节点是祖父节点的左子树
    {
    y
    = z->parent->parent->left;//y为z的叔节点
    if(y && y->color == red)//叔节点存在而且为红
    {
    z
    ->parent->color = black;//更改父节点为黑
    y->color = black;//叔节点也改为黑
    z->parent->parent->color = red;//祖父节点改为红
    z = z->parent->parent;//z上升至祖父节点继续迭代确保红黑树的性质
    }
    else //无叔节点或者叔节点为黑
    {
    if (z == z->parent->right)//如果新节点是父节点的右子树
    {
    z
    = z->parent;
    left_rotate(z);
    }
    z
    ->parent->color = black;//父节点改为黑色
    z->parent->parent->color = red;//祖父节点改为红色
    right_rotate(z->parent->parent);
    }
    }
    else
    {
    y
    = z->parent->parent->right;//y为z的叔节点
    if(y && y->color == red)//叔节点存在而且为红
    {
    z
    ->parent->color = black;//更改父节点为黑
    y->color = black;//叔节点也改为黑
    z->parent->parent->color = red;//祖父节点改为红
    z = z->parent->parent;//z上升至祖父节点继续迭代确保红黑树的性质
    }
    else //无叔节点或者叔节点为黑
    {
    if (z == z->parent->left)//如果新节点是父节点的右子树
    {
    z
    = z->parent;
    right_rotate(z);
    }
    z
    ->parent->color = black;//父节点改为黑色
    z->parent->parent->color = red;//祖父节点改为红色
    left_rotate(z->parent->parent);
    }
    }
    }
    T
    ->color = black;
    return T;
    }

  • 相关阅读:
    Echarts图表 相关技术点
    Jquery off() on() data()
    Js 正则表达式
    Java jar项目获取配置文件的项
    Java String.split 的坑,会忽略空值
    C# 工作流 状态机 门控制
    二维码SDK,高效率,高识别率,甩zxing,zbar几条街
    C#文本转语音,可导出在本地mp3或者wav文件
    api接口签名验证(MD5)
    C# 站点IP访问频率限制 针对单个站点的实现方法
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/1899468.html
Copyright © 2011-2022 走看看