【问题标题】:Why this transplant function works for a binary search tree?为什么这个移植函数适用于二叉搜索树?
【发布时间】: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;
}

不是我不明白它是如何工作的,而是我不明白它为什么起作用。当我进行函数调用时,我基本上是在向函数发送指针rootuv 的副本,对吗?所以函数中所做的更改实际上不应该反映在根上,除非我返回它或使用指向指针类型的指针,但它实际上改变了原始根。我将 root 定义为全局变量,这会改变什么吗?

【问题讨论】:

  • 你如何调用函数? root 是如何创建的?
  • 如果uroot 应该不起作用,那么您实际上只更改了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


【解决方案1】:

如果u->parentNULL,则该函数将不起作用,在这种情况下,只有局部变量root 设置为v,从函数外部访问的任何内容都不会改变。

如果u->parent != NULL,那么u->parent->leftu->parent->rightNode 指向的Node 的成员u->parent,它们被覆盖,因此更改在main 中可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多