使用全局指针在C ++中实现红黑树

时间:2013-07-16 07:15:51

标签: c++ algorithm red-black-tree

我无法在以下代码中更新我的全局指针

#include <iostream>

using namespace std;

struct RB{
    RB()=default;
    RB(int clr):color(clr) { }
    int color;
    RB *p,*left,*right;
    int key;
};

RB *Tnil=new RB(0);
RB *T=Tnil;
void insert(RB *T,RB *z)
{
    RB *y=Tnil;
    RB *x=T;
    while(x!=Tnil)
    {
        y=x;
        if(z->key<y->key)
          x=x->left;
        else
         x=x->right;
    }
    z->p=y;
    if(y==Tnil)
      T=z;
    else if(z->key<y->key)
      y->left==z;
    else
      y->right=z;
    z->right=Tnil;
    z->left=Tnil;
    z->color=1;
}

void print(RB *T)
{
    if(T==Tnil)
      return;
    print(T->left);
    cout<<T->key;
    print(T->right);
}

int main()
{
  for(int i=1;i<10;++i)
  {
    RB *x=new RB;
    x->key=i;
    insert(T,x);

  }
   print(T);
}

问题是,当我预期它为真时,y==Tnil函数中的比较insert的计算结果为false。结束函数后,T再次变为等于Tnil,因此不会插入任何内容。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)


您想要更新全球T. 因此,您应该传递全局T的引用来插入:

替换

  

void insert(RB * T,RB * z)

  

void insert(RB *&amp; T,RB * z)

(否则只更新全局指针T的副本)

正如您的示例中的ComicSansMS所述

y->left==z 

应替换为

y->left=z


最佳,

杰克

答案 1 :(得分:0)

你的命名搞砸了。

您有两个名为T的变量,一个在全局范围内,另一个作为insert的参数。因此,T=z;中的赋值insert实际上不会对全局变量T起作用,而是对参数起作用,因此在函数外部没有副作用。

作为一般规则,请尽量避免使用Tzx这样的单字母变量名称。它们使您的代码难以阅读,并且可以轻松隐藏此类错误。此外,避免从函数内部进行非本地化更新。从函数更新全局变量只是要求这样的麻烦。更好的方法是让insert返回指向新顶级节点的指针。