【问题标题】:Binary Search Tree in CC中的二叉搜索树
【发布时间】:2011-01-31 04:57:07
【问题描述】:

我是一个 Python 人。学习 C 语言,我一直在尝试在 C 中实现二叉搜索树。我写下了代码,我已经尝试了几个小时,但是无法按预期获得输出。请帮忙!

请纠正我。

#include<stdlib.h>
#include<stdio.h>

typedef int ElementType;

typedef struct TreeNode {
  ElementType element;
  struct TreeNode *left, *right;
} TreeNode;

TreeNode *createTree(){
    //Create the root of tree
    TreeNode *tempNode;
    tempNode = malloc(sizeof(TreeNode));
    tempNode->element = 0;
    tempNode->left = NULL;
    tempNode->right = NULL;
    return tempNode;
}

TreeNode *createNode(ElementType X){
    //Create a new leaf node and return the pointer
    TreeNode *tempNode;
    tempNode = malloc(sizeof(TreeNode));
    tempNode->element = X;
    tempNode->left = NULL;
    tempNode->right = NULL;
    return tempNode;
}

TreeNode *insertElement(TreeNode *node, ElementType X){
    //insert element to Tree
    if(node==NULL){
        return createNode(X);
    }
    else{
        if(X < node->element){
            node->left = insertElement(node->left, X);
        }
        else if(X > node->element){
            node->right =  insertElement(node->right, X);
        }
        else if(X == node->element){
            printf("Oops! the element is already present in the tree.");
        }
    }
}

TreeNode *displayTree(TreeNode *node){
    //display the full tree
    if(node==NULL){
        return;
    }
    displayTree(node->left);
    printf("| %d ", node->element); 
    displayTree(node->right);
}

main(){
    //pointer to root of tree #2
    TreeNode *TreePtr;
    TreeNode *TreeRoot;
    TreeNode *TreeChild;

    //Create the root of tree
    TreePtr = createTree();

    TreeRoot = TreePtr;

    TreeRoot->element = 32;
    printf("%d\n",TreeRoot->element);

    insertElement(TreeRoot, 8);
    TreeChild = TreeRoot->left;
    printf("%d\n",TreeChild->element);  

    insertElement(TreeRoot, 2);
    insertElement(TreeRoot, 7);
    insertElement(TreeRoot, 42);
    insertElement(TreeRoot, 28);
    insertElement(TreeRoot, 1);
    insertElement(TreeRoot, 4);
    insertElement(TreeRoot, 5);

// the output is not as expected :(
    displayTree(TreeRoot);
}

【问题讨论】:

  • “无法按预期获得输出”究竟是什么意思?
  • 调试您的代码并找到您的确切问题。
  • @Naveen 我明白了 | 5 | 32 | 42 调用 displayTree() 函数时。我希望它也能打印剩余的元素。
  • @Naveen 嗨,我尝试从上面复制粘贴代码,但“createTree”函数无法编译。然后我在malloc 之前添加了 (TreeNode*) 演员表,它起作用了。我想知道这与我使用的是旧的 c89 编译器有关吗?

标签: c binary-search-tree


【解决方案1】:

您的insertElement 并不总是返回值。这就是你的递归调用出错的原因。告诉你的编译器警告你这样的错误(例如,在 gcc 上,使用-Wall)。

displayTree 也有类似的错误,指定返回TreeNode* 时什么也不返回。

main 也应该返回一个值(或者你应该声明它void)。

【讨论】:

  • Afaik 声明 main 为返回 void 自 C99 以来已弃用。
  • @Thomas 谢谢!根据 codeaddict 建议的代码,现在 insertElement() 函数返回一个值。它有效!
  • @Felix:它并没有真正被弃用:C99 允许实现定义的入口点,并且对于 main() 的返回类型有以下说法:“如果返回类型与int,返回宿主环境的终止状态未指定”;出于可移植性的原因,您应该尽可能避免实现定义和未指定的行为,即坚持int main(void)int main(int argc, char *argv[])
  • 顺便说一句:如果您声明main() 为返回int,您仍然可以省略return,因为到达main() 的末尾会隐式返回0;我自己添加了显式返回,因为我喜欢在 tinyCC 中测试我的代码,否则会返回垃圾
【解决方案2】:

问题在于插入。如果nodeNULL,则创建一个新节点并将其返回。但是如果节点不是NULL 怎么办。您正在对右/左子树进行正确的更改,但您没有返回任何内容。

改变

if(X < node->element){
    node->left = insertElement(node->left, X);
}
else if(X > node->element){
    node->right =  insertElement(node->right, X);
}

到:

if(X < node->element){
    node->left = insertElement(node->left, X);
    return node; // add this.
}
else if(X > node->element){
    node->right =  insertElement(node->right, X);
    return node; // add this.
}

【讨论】:

  • 哇!有用..!非常感谢codaddict!但是,无法弄清楚它究竟是如何工作的。这个返回值node 去哪里了?对不起,关于愚蠢的问题:)
  • @heapzero:返回值设置为父节点的子节点。如果您没有返回任何内容,那么它可能会拾取最后创建的节点并将其附加为父节点的子节点。因此,您新创建的节点仅被添加为根节点的子节点。
  • 感谢@Naveen!现在说得通了!
  • @codaddict 'insertElement' 函数中的第一个返回语句不应该是return node = createNode(X) 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多