我的二叉搜索树 C 程序有一个 problem.I am using inorder traversal.only root node printed 为什么?

My binary search tree c program has a problem.I am using inorder traversal.only root node printed why?

它是一个中序的二叉搜索树 traversal.there 在打印元素时出现问题。 我无法解决 issue.Only root 正在获取 printed.it 可能是语义错误 also.Maybe inserting.or 有问题 inserting.or 显示无序。

 #include<stdio.h>
    #include<stdlib.h>
    struct node
    {
        int data;
        struct node *llink;
        struct node *rlink;
    };
    typedef struct node bstnode;
    bstnode *root=NULL;

void insert(int ele)
{
    bstnode *cur,*prev,*temp;
    temp=(bstnode *)malloc(sizeof(bstnode));
    temp->data=ele;
    temp->llink=temp->rlink=NULL;
    cur=root;
    prev=NULL;
    if(root==NULL)
       root=temp;
    else
    {  
        prev=cur;
        while(cur!=NULL)
        {
         if(ele<cur->data)
            cur=cur->llink;
         else
           cur=cur->rlink;
        }
    if(ele<prev->data)    
      prev->llink=temp;
       else
        prev->rlink=temp;
    }
    //return root; 
}

void inorder()
{
if(root==NULL)
{
    return;}
else{
inorder(root->llink); 
printf("\n%d",root->data);
inorder(root->llink);
}
}

int main()
{
    insert(45);
    insert(76);

    inorder();
}

在此代码段中

else
{  
    prev=cur;
    while(cur!=NULL)
    {
     if(ele<cur->data)
        cur=cur->llink;
     else
       cur=cur->rlink;
    }
if(ele<prev->data)    
  prev->llink=temp;
   else
    prev->rlink=temp;
}

逻辑错误。声明

    prev=cur;

应在以下 while 语句中。例如

    while(cur!=NULL)
    {
     prev=cur;
     if(ele<cur->data)
        cur=cur->llink;
     else
       cur=cur->rlink;
    }

和函数 inorder。也不正确,因为它是在没有参数的情况下声明的

void inorder()
{
if(root==NULL)
{
    return;}
else{
inorder(root->llink); 
printf("\n%d",root->data);
inorder(root->llink);
}
}

还有两次使用数据成员llink

应该像

那样声明和定义
void inorder( const bstnode *node )
{
    if ( node )
    {
        inorder( node->llink ); 
        printf( "\n%d", node->data );
        inorder( node->rlink );
    }
}

它被称为

inorder( root );

首先是部分

        prev=cur;
        while(cur!=NULL)
        {
         if(ele<cur->data)
            cur=cur->llink;
         else
           cur=cur->rlink;
        }

错了。

由于prev=cur;的位置错误,prev将只是root而不是指向作为新节点父节点的节点。 该语句应在循环内:

        while(cur!=NULL)
        {
         prev=cur;
         if(ele<cur->data)
            cur=cur->llink;
         else
           cur=cur->rlink;
        }

其次,函数inorder是错误的。 当root != NULL.

时无条件执行

代替忽略参数并无限打印 root,它应该使用一个参数来指定应该打印哪个节点。

使用 llink twich 也很奇怪。

可以这样:

void inorder(bstnode* node)
{
    if(node==NULL)
    {
        return;
    }
    else{
        inorder(node->llink); 
        printf("\n%d",node->data);
        inorder(node->rlink);
    }
}

main函数中的inorder();应该是inorder(root);.