2010-03-24 90 views
5

我是一个Python家伙。学习C语言,我一直试图在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); 
} 
+0

究竟是 “无法得到的输出如预期” 是什么意思? – Naveen 2010-03-24 10:44:37

+0

调试您的代码并找到确切的问题。 – medopal 2010-03-24 10:46:50

+0

@Naveen我得到| 5 | 32 | 42调用displayTree()函数时。我希望它能打印剩余的元素。 – heapzero 2010-03-24 10:47:03

回答

5

问题在于插入。如果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. 
} 
+0

哇!有用..!非常感谢codaddict! 但是,无法弄清楚它的工作原理。 这个返回值'node'去哪了? 对不起,关于这个愚蠢的问题:) – heapzero 2010-03-24 10:58:59

+0

@heapzero:将返回值设置为父节点的子节点。如果你没有返回任何东西,那么它可能拾取最后创建的节点并将其附加为父节点的子节点。因此,您新创建的节点已被添加为仅作为根节点的子节点。 – Naveen 2010-03-24 11:06:08

+0

谢谢@Naveen!现在有道理! – heapzero 2010-03-24 11:13:40

2

您的insertElement并不总是返回一个值。这就是为什么你的递归调用出错。告诉你的编译器警告你类似的错误(例如,在gcc上,使用-Wall)。

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

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

+1

Afaik自C99以来已弃用声明'main'为返回'void'。 – 2010-03-24 10:58:01

+0

@Thomas谢谢!根据codeaddict建议的代码,现在'insertElement()'函数返回一个值。有用! – heapzero 2010-03-24 11:09:43

+0

@Felix:它并不真正被废弃:C99允许实现定义的入口点,并且有关于main()的返回类型的说法如下:“如果返回类型与int不兼容,终止状态返回到主机环境未指定“;出于可移植性的原因,你应该尽可能地避免实现定义和未指定的行为,即坚持'int main(void)'和'int main(int argc,char * argv [])' – Christoph 2010-03-24 11:20:36