使用全局指针在C++中实现红黑树
Implementation of Red black tree in C++ using global pointer
我在更新以下代码中的全局指针时遇到问题,
#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);
}
问题是,当我期望insert
函数中的比较y==Tnil
为true时,它的计算结果为false。函数结束后,T
再次变为等于Tnil
,因此没有插入任何内容。有什么帮助吗?
您想要更新全局T。
因此,您应该传递全局T的引用以插入:
更换
空心插入件(RB*T,RB*z)
带有
空心插入件(RB*&T,RB*z)
(否则,只更新全局指针T的副本)
同样正如ComicansMS在您的示例中所提到的
y->left==z
应该被取代
y->left=z
最佳,
Jack
您的命名搞砸了。
您有两个名为T
的变量,一个在全局范围内,另一个作为insert
的参数。因此,insert
中的赋值T=z;
实际上并不作用于全局变量T
,而是作用于参数,因此在函数之外没有副作用。
一般来说,尽量避免使用像T
、z
和x
这样的单字母变量名。它们使您的代码难以阅读,并且可以很容易地隐藏像这样的错误。此外,请避免从函数内部进行非本地化更新。从函数中更新全局变量只会带来这样的麻烦。更好的方法是让insert
返回一个指向新顶级节点的指针。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的