【问题标题】:Adding nodes to Binary Search Tree将节点添加到二叉搜索树
【发布时间】:2012-11-29 20:16:04
【问题描述】:

免责声明:这是一个作业。我不是要求明确的代码答案,只是帮助理解我的代码为什么不起作用。

我正在尝试实现一个基本的二叉搜索树,但我的_addNode(...) 函数出现问题。

这就是问题所在。当我使用调试器浏览我的代码时,我注意到叶节点在两侧(左侧和右侧)无限创建,因此除了创建根之外,叶节点永远不会是NULL。问题是我要求我的程序在找到叶子所在的NULL 值时创建一个新节点。因此,如果没有任何NULL 值,就永远不会创建任何新叶子,对吧?

我遇到的另一个问题是我的compare(...) 函数。在调试器中单步执行它会显示它多次迭代函数,但实际上从未返回值。当它返回到调用函数时,它又回到compare(...) 函数并无限循环。同样,考虑到我在每个 if 语句中都有有效的返回语句,我不知道为什么会发生这种情况。

这是您可能需要的所有代码。如果我遗漏了什么,请告诉我,我会发布它。

struct Node {
    TYPE         val;
    struct Node *left;
    struct Node *right;
};

struct BSTree {
    struct Node *root;
    int          cnt;
};

struct data {
    int number;
    char *name;
};

int compare(TYPE left, TYPE right)
{
    assert(left != 0);
    assert(right != 0);

    struct data *leftData = (struct data *) left;
    struct data *rightData = (struct data *) right;

    if (leftData->number < rightData->number) {
        return -1;
    }
    if (leftData->number > rightData->number) {
        return 1;
    } else return 0;
}

void addBSTree(struct BSTree *tree, TYPE val)
{
    tree->root = _addNode(tree->root, val);
    tree->cnt++;
}

struct Node *_addNode(struct Node *cur, TYPE val)
{
    assert(val != 0);

    if(cur == NULL) {
        struct Node * newNode = malloc(sizeof(struct Node));
        newNode->val = val;
        return newNode;
    }
    if (compare(val, cur->val) == -1) {
        //(val < cur->val)
        cur->left = _addNode(cur->left, val);
    } else cur->right = _addNode(cur->right, val);

    return cur;
}

编辑:添加以下函数

int main(int argc, char *argv[])
{
    struct BSTree *tree = newBSTree();

    /*Create value of the type of data that you want to store*/
    struct data myData1;
    struct data myData2;
    struct data myData3;
    struct data myData4;

    myData1.number = 5;
    myData1.name = "rooty";
    myData2.number = 1;
    myData2.name = "lefty";
    myData3.number = 10;
    myData3.name = "righty";
    myData4.number = 3;
    myData4.name = "righty";

    /*add the values to BST*/
    addBSTree(tree, &myData1);
    addBSTree(tree, &myData2);
    addBSTree(tree, &myData3);
    addBSTree(tree, &myData4);

    /*Print the entire tree*/
    printTree(tree);
    /*(( 1 ( 3 ) ) 5 ( 10 ))*/
    return 1;
}

【问题讨论】:

  • 你能贴出执行这些功能的代码吗?
  • 是typedef struct data *TYPE吗? (我假设它只是在看代码)。
  • 你知道的。我终于复制了这段代码并执行了它。在我明确地将 newNode 中的值设为 0 之后,我没有发现任何问题。

标签: c nodes binary-search-tree


【解决方案1】:

也许您可以尝试在malloc 之后将左右设置为NULL

struct Node * newNode = malloc(sizeof(struct Node));
newNode->left = NULL;
newNode->right = NULL;

【讨论】:

  • 不知道为什么我没有想到这一点。谢谢。这个问题现在似乎源于compare(...)
【解决方案2】:

在此处检查这一行(或左对应的):

cur->right = _addNode(cur->right, val);

如果 cur->right == 0,没关系。但是如果cur->right != 0,则原来坐在那里的节点会被_addNode的返回值代替,最终不是一个完整的分支,而只是一个节点。

我喜欢在 malloc 之后使用 memset(newNode, 0, sizeof(struct Node)) 显式地将结构中的值设为 0。其他人可能不同意。

【讨论】:

  • 但是if(cur == NULL) 操作没有解决这个问题吗? _addNode(...) 应该认出cur-&gt;right 为NULL,然后根据前面提到的if 语句分配一个新节点。 ...对吗?
  • 是的,我认为你是对的。我只是再看一些,然后意识到我可能在这里错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多