【问题标题】:BST insertion in c using recursion使用递归在 c 中插入 BST
【发布时间】:2017-10-03 09:07:21
【问题描述】:

我是 c 新手,但我用其他语言编程过。我有这段代码用于 BST 插入:

struct tnode {
  int data;
  struct tnode* left;
  struct tnode* right;
};

struct tnode* addnode(struct tnode* root, int data) {
    if (root == NULL) return talloc(data);
    else if (data < root->data) root->left = addnode(root->left, data);
    else root->right = addnode(root->right, data);
}

代码运行良好,但试图理解它是如何工作的却让我发疯。我觉得它不应该正确返回,但我已经对其进行了广泛的测试并且它有效。我的抱怨是,当您使用值不为 NULL 的根调用 addnode 时,它​​会递归调用 addnode,它将一个新的 tnode 返回到 root->left 或 root->right。这可以。但是,在递归调用返回后,函数应该从原始调用中的那个点恢复执行。然后它应该在 if-else 子句之后恢复。在该条款之后没有回报。当我添加多个项目时,它是如何正确返回的?

我正在尝试并在 if-else 子句之后添加了一个puts("hello");,这搞砸了整个事情并给了我一个分段错误:11(无论这意味着什么)。

【问题讨论】:

  • 添加talloc函数。
  • 您应该收到编译警告,因为函数的 else ifelse 分支没有返回。您可能应该在 } 之前添加 return root;

标签: c recursion binary-search-tree


【解决方案1】:

你完全正确。您拥有的函数在 else 语句之后缺少一个返回调用,这肯定会让您感到困惑。尝试使用以下函数:

struct tnode* addnode(struct tnode* root, int data) {
    if (root == NULL) return talloc(data);
    else if (data < root->data) root->left = addnode(root->left, data);
    else root->right = addnode(root->right, data);
    return root;
}

如果这有帮助,请告诉我。编程愉快!

【讨论】:

  • 谢谢,这更有意义。知道为什么 OP 中的版本有效吗?我觉得这很奇怪。
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 2014-04-24
  • 2018-03-25
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2017-09-05
相关资源
最近更新 更多