C 二叉搜索树

C 二叉搜索树,c,binary-search-tree,C,Binary Search Tree,我正在尝试建立一个二叉搜索树。但是在执行不同的遍历时,我没有得到正确的输出 typedef struct binary_search_tree{ struct binary_search_tree *lchild; int data; struct binary_search_tree *rchild; }bst_t; #define ALLOCATE (bst_t*)malloc(sizeof(bst_t)) 以下是插入函数: void insert(bst_t *

我正在尝试建立一个二叉搜索树。但是在执行不同的遍历时,我没有得到正确的输出

typedef struct binary_search_tree{
    struct binary_search_tree *lchild;
    int data;
    struct binary_search_tree *rchild;
}bst_t;

#define ALLOCATE (bst_t*)malloc(sizeof(bst_t))
以下是插入函数:

void insert(bst_t *ptr,int data){
    if( ptr->data < data){
        if ( ptr->lchild == NULL ){
            ptr->lchild = ALLOCATE;
            ptr->lchild->data = data;
            return;
        }else
            insert(ptr->lchild,data);
    }else{
        if ( ptr->rchild == NULL ){
            ptr->rchild = ALLOCATE;
            ptr->rchild->data = data;
            return;
        }else
            insert(ptr->rchild,data);
    }
}
void插入(bst\u t*ptr,int数据){
如果(ptr->数据<数据){
如果(ptr->lchild==NULL){
ptr->lchild=分配;
ptr->lchild->data=数据;
返回;
}否则
插入(ptr->lchild,数据);
}否则{
如果(ptr->rchild==NULL){
ptr->rchild=分配;
ptr->rchild->data=数据;
返回;
}否则
插入(ptr->rchild,数据);
}
}
这个函数正确吗?
调用该函数时,我正在发送root的地址。

问题在于
分配
宏。它在正确分配和初始化新节点方面做得远远不够。我建议创建一个
newNode
函数,为节点分配内存,然后初始化结构的所有成员,如下所示

bst_t *newNode(int data)
{
    // allocation and error checking
    bst_t *node = malloc(sizeof(bst_t));
    if ( node == NULL )
    {
        fprintf(stderr, "out of memory\n");
        exit( 1 );
    }

    // initialize the members of the structure
    node->lchild = NULL;
    node->data = data;
    node->rchild = NULL;

    return node;
}
然后,
insert
功能可以简化为

void insert(bst_t *ptr,int data)
{
    if( ptr->data < data){
        if ( ptr->lchild == NULL )
            ptr->lchild = newNode(data);
        else
            insert(ptr->lchild,data);
    }else{
        if ( ptr->rchild == NULL )
            ptr->rchild = newNode(data);
        else
            insert(ptr->rchild,data);
    }
}
void插入(bst\u t*ptr,int数据)
{
如果(ptr->数据<数据){
如果(ptr->lchild==NULL)
ptr->lchild=newNode(数据);
其他的
插入(ptr->lchild,数据);
}否则{
如果(ptr->rchild==NULL)
ptr->rchild=newNode(数据);
其他的
插入(ptr->rchild,数据);
}
}

您忽略了
malloc
不会初始化内存。因此,新节点中的指针不是
NULL
,而是不确定的。我无法理解您的意思。请解释一下,在
ptr->lchild->data=data之后您遗漏了
ptr->lchild->lchild=NULL;ptr->lchild->rchild=NULL和其他分支中的类似内容。@ParnabSanyal可以,但这是由未定义的行为引起的症状。在编写数据结构(如tree)时,始终以空的大小写开始。你的函数在空树上工作吗?别这么想。有人可能会说,空箱是在别处处理的,或者树从来都不是空的,但这总是以这样或那样的方式导致麻烦。。我想我已经按照你的指示做了,但是唉!仍然不工作。。谢谢你抽出时间。如果你发现什么,请告诉我@ParnabSanyal如果代码中有其他问题,则需要开始一个新问题。在这个问题上,一定要提供一个答案。并提供样本输入,以及预期和实际输出!我在我的另一个二叉树程序中使用了相同的ALLOCATE宏。它工作良好,输出正确。所以,我认为宏观经济不是问题所在。好的,我会在一个新的线程中发布这个。