引用指针的递归调用和赋值
Recursive call and assignment of reference pointers
我对 c++ 中的指针感到困惑,我正在尝试实现 BST。
而不是(方法1)具有节点类型,我想使用引用指针(方法2)。
- 我怎么能重写 if 语句,这样它就可以在使用指针的方法中工作?
- 如何将 (2) 中的节点 p 分配给另一个临时节点?
非常感谢。
//1
node* delete(node* p, int k) // deleting k key from p tree
{
if( k < p->key )
p->left = remove(p->left,k);
}
//2
void delete(int key, node*& p) {
// recursive call while key is less and assign a new left child.
if( k < p->key ) {
//??
}
}
node *getNode(int key, node *haystack){
if(!haystack)
return NULL;
if(haystack->val == key)
return haystack;
if(haystack->val < key)
return getNode(key, haystack->left);
return getNode(key, haystack->right);
}
void getNode(int key, node *haystack, node *&result){
if(!haystack){
result = NULL;
return;
}
if(haystack->val == key){
result = haystack;
return;
}
if(haystack->val < key){
return getNode(key, haystack->left, result);
}
return getNode(key, haystack->left, result);
}
它们最终几乎相同。 但是,如果您确实想要删除,则需要将已删除节点的指针设置为指向已删除节点的指针,以NULL
删除的节点是否为叶子,或者您需要将已删除节点的子节点添加到树中(或删除这些子节点)。
我假设你想传递一个引用,这样你就可以把指针归零了?
这样的事情应该有效:
void delete_node(int key, node*&p)
{
if (key < p->key) {
delete_node(key, p->left);
delete(p);
p = nullptr;
}
}
但这有点调皮。它限制了可以调用函数的情况数量,并增加了一些潜在的令人惊讶的行为,因为它会改变其输入参数。这也意味着当递归删除节点时,节点的left
成员被不必要地清零(因为当前节点本身无论如何都会被删除)。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 为什么初始化时没有调用重载赋值运算符?
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 显式调用普通默认构造函数会导致额外的赋值调用
- 使用赋值运算符将宏转换为函数调用
- 从赋值运算符调用构造函数
- 避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数
- 赋值运算符重载在通过指针访问时不调用
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 为什么在赋值操作完成后调用对象的析构函数
- 在其赋值运算符方法中调用对象的析构函数
- 析构函数是移动ctor/赋值的RHS上唯一调用过的东西吗
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 为什么在进行复制赋值之前调用复制构造函数
- 未调用移动赋值运算符