繁体   English   中英

我的二叉搜索树c程序有问题。我使用的是中序遍历。为什么只打印根节点?

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

它是一个具有中序遍历的二叉搜索树。打印元素时出现问题。 我无法解决这个问题。只有根正在打印。它也可能是语义错误。也许插入有问题。或者显示无序有问题。

 #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=cur; , prev将只是root而不是指向要成为新节点父节点的节点。 该语句应该在循环内:

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

其次,函数inorder错误。 root != NULL时无条件执行。

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

使用llink也很奇怪。

它可以是这样的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM