【问题标题】:Inserting node into binary tree using pointers使用指针将节点插入二叉树
【发布时间】:2019-12-13 07:39:01
【问题描述】:

我正在尝试使用以下结构创建将节点插入 BST 的方法:

// node structure
struct Node {
    int val;
    struct Node* left;
    struct Node* right;
};

// binary tree structure
struct BinaryTree {
    struct Node* root;
};

最初我创建了这个方法来向树中添加节点:

// add value to binary tree
void _AddNode(struct Node* node, int val) {
    if (node == NULL)
        *(&node) = CreateNode(val);
    else if (val <= node->val)
        _AddNode(node->left, val);
    else
        _AddNode(node->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
    _AddNode(tree->root, val);
}

使用此函数构建树,当我尝试遍历、打印、访问树中的数据时,我收到 Segmentation fault: 11 错误。

但是,当我修改函数以传入双指针并有效地执行相同的操作时:

// add value to binary tree
void _AddNode(struct Node** node, int val) {
    if (*node == NULL)
        *node = CreateNode(val);
    else if (val <= (*node)->val)
        _AddNode(&(*node)->left, val);
    else
        _AddNode(&(*node)->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
    _AddNode(&tree->root, val);
}

为什么后者有效,而前者无效。

【问题讨论】:

  • 对于各种图形,我的常见建议是使用笔和纸来解决最常见的问题。在纸上画一棵树,用小方块作为节点,在方块内写下值,然后用箭头作为指针。通过擦除箭头并重新绘制它们来“重新排列”树。
  • "Originally I created" 代码中*(&amp;node) 不正确。 node(作为参数)被声明为函数的局部变量,等同于简单的node
  • 它们不一样——在第一种情况下你不能改变指针,而在第二种情况下你可以。
  • 对不起,我在看“最初是我创建的”,应该更清楚。
  • 与您的问题无关,但在 C 中,所有以下划线开头并后跟大写字母(如_AddNode)的符号都是保留的。参见例如this reserved identifier reference了解详情。

标签: c pointers binary-tree


【解决方案1】:

但是,当我修改函数以传入一个双指针并有效地做同样的事情时,它起作用了

基本相同的东西,在根本上不同的数据。您最初尝试中的(&amp;node) 为您提供了一个指向局部变量的指针。当您取消引用并分配给结果时,您正在修改局部变量。这样的修改对调用者来说是不可见的。

另一方面,如果你向你的函数传递(比如)一个合适的双指针,比如_AddNode(&amp;(*node)-&gt;left, 42),那么函数参数的值指向同一个东西:调用者的(*node)-&gt;left。如果您取消引用该指针并分配给结果,那么自然 对调用者可见。

看来原来的和修改后的功能是一样的

显然,它们在词汇上并不相同。您的意思似乎是它们在您看来是等价的,但由于行为上的差异反驳了这种等价性,因此这两个函数的明显差异实际上产生了不同的语义,这是理所当然的。似乎让你感到困惑的关键是,在 C 中,函数参数总是按值传递,所以每个函数参数都以调用者传递的开头,但是不是调用者对应参数的别名。指针类型的参数也不例外。

【讨论】:

  • 这很有意义,传递给函数的参数是本地的,所以如果我想编辑指针的值,我需要传入对该指针的引用(只需就像你对变量一样)。谢谢!
  • 是的,@JayMody,就是这样。现在您似乎已经掌握了一个引起许多人麻烦的观点:指针只是另一种数据类型,而指针值只是该类型的值,在这个意义上完全类似于 42 作为类型 int 的值。
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多