【问题标题】:How can I return the pointer to a specific node in this Binary Tree?如何将指针返回到此二叉树中的特定节点?
【发布时间】:2021-03-06 19:31:18
【问题描述】:

我有两种方法(布尔值和指针返回值)用于在 C 中搜索二叉树中的值:

bool findInTree(BTNode* bt, char* str) {
    if (bt == NULL) {
        return false;
    }

    if (strcmp(((Course*) (bt->data))->name, str) == 0) {
        return true;
    }

    bool b1 = findInTree(bt->left, str);

    if (b1) {
        return true;
    }

    bool b2 = findInTree(bt->right, str);
    return b2;
}
void* findAndReturnInTree(BTNode* bt, char* str) {
    if (bt == NULL) {
        return (void*) NULL;
    }

    if (strcmp(((Course*) (bt->data))->name, str) == 0) {
        return bt->data;
    }

    void* b1 = findAndReturnInTree(bt->left, str);

    if (strcmp(((Course*) (b1))->name, str) == 0) {
        return b1;
    }

    void* b2 = findAndReturnInTree(bt->right, str);
    return b2;
}

findInTree() 工作正常,并根据该值是否在树中返回正确的布尔值。但是,findAndReturnInTree() 不起作用,并且我不断收到分段错误。我试图用findInTree() 对其进行建模,但返回的是指针而不是布尔值。顺便说一句,我使用void 指针作为->data,以便我可以使用多个结构并具有某种通用实现。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 使用调试器。至少对于您自己和在 SO 上发布,您应该使用调试器找出触发 seg 错误的确切代码行。然后继续使用调试器跟踪代码。
  • 这看起来像是个问题:if (strcmp(((Course*) (b1))->name, str)b1 值来自 findAndRetunInTree,它可以返回 NULL。所以应该在取消引用之前检查b1 是否为NULL。同样,调试器会立即将您指向该行并向您显示 b1NULL

标签: c pointers find binary-tree nodes


【解决方案1】:

如果找不到树节点,b1b2 的值可能为 NULL。
在thant b1->name 之后可能是分段错误。

你为什么不在b1b2添加检查NULL?
C 程序员总是检查异常情况。

void* findAndReturnInTree(BTNode* bt, char* str) {
    if (bt == NULL) {
        return (void*) NULL;
    }

    if (strcmp(((Course*) (bt->data))->name, str) == 0) {
        return bt->data;
    }

    void* b1 = findAndReturnInTree(bt->left, str);

    if (b1 == NULL) return findAndReturnInTree(bt->right, str);

    if (strcmp(((Course*) (b1))->name, str) == 0) {
        return b1;
    }

    void* b2 = findAndReturnInTree(bt->right, str);
    return b2;
}

【讨论】:

  • 不要认为添加return 是完全正确的。还需要继续搜索bt->right
猜你喜欢
  • 2021-11-30
  • 2019-03-12
  • 2023-04-07
  • 2019-12-13
  • 2023-03-13
  • 1970-01-01
  • 2015-07-18
  • 2023-03-20
  • 2020-09-08
相关资源
最近更新 更多