【发布时间】:2012-09-22 22:14:39
【问题描述】:
在 CLRS 中关于二叉搜索树的章节中,我遇到了将节点 u 替换为节点 v 并在父元素中进行适当更改的移植功能。
这是我为移植功能编写的代码:
void transplant(Node* root, Node* u, Node* v)
{
if(u->parent == NULL)
root = v;
else if(u == u->parent->left)
u->parent->left = v;
else
u->parent->right = v;
if(v != NULL)
v->parent = u->parent;
}
不是我不明白它是如何工作的,而是我不明白它为什么起作用。当我进行函数调用时,我基本上是在向函数发送指针root、u、v 的副本,对吗?所以函数中所做的更改实际上不应该反映在根上,除非我返回它或使用指向指针类型的指针,但它实际上改变了原始根。我将 root 定义为全局变量,这会改变什么吗?
【问题讨论】:
-
你如何调用函数?
root是如何创建的? -
如果
u是root应该不起作用,那么您实际上只更改了root的本地副本。在其他情况下,您有指向实际Nodes 的指针并更改它们。 -
我将函数称为
transplant(root, z, z->right)root是一个指向全局定义为Node* root = NULL的结构的指针 -
@Aryan 尝试用
transplant(root, root, root->right)调用它,看看root是否在main中发生变化。 -
@DanielFischer 是的,它确实将
root更改为NULL
标签: c binary-search-tree