首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的二进位搜索树c程序有一个问题,我用无序的traversal.only根节点打印为什么?

我的二进位搜索树c程序有一个问题,我用无序的traversal.only根节点打印为什么?
EN

Stack Overflow用户
提问于 2020-09-28 14:53:22
回答 2查看 46关注 0票数 1

它是一个带有无序traversal.there的二进制搜索树,在打印元素时是一个问题。我解决不了issue.Only,根目录是gettting,printed.it可能是一个语义错误,also.Maybe在inserting.or中有一些问题,在无序显示方面。

代码语言:javascript
复制
 #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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-28 14:58:23

在这个代码片段中

代码语言:javascript
复制
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;
}

这是一个合乎逻辑的错误。声明

代码语言:javascript
复制
    prev=cur;

应在下列时间内陈述。例如

代码语言:javascript
复制
    while(cur!=NULL)
    {
     prev=cur;
     if(ele<cur->data)
        cur=cur->llink;
     else
       cur=cur->rlink;
    }

以及函数inorder。也不正确,因为声明时没有参数。

代码语言:javascript
复制
void inorder()
{
if(root==NULL)
{
    return;}
else{
inorder(root->llink); 
printf("\n%d",root->data);
inorder(root->llink);
}
}

此外,还使用了数据成员llink两次。

它应该声明和定义如下

代码语言:javascript
复制
void inorder( const bstnode *node )
{
    if ( node )
    {
        inorder( node->llink ); 
        printf( "\n%d", node->data );
        inorder( node->rlink );
    }
}

它被称为

代码语言:javascript
复制
inorder( root );
票数 1
EN

Stack Overflow用户

发布于 2020-09-28 15:01:46

第一,部分。

代码语言:javascript
复制
        prev=cur;
        while(cur!=NULL)
        {
         if(ele<cur->data)
            cur=cur->llink;
         else
           cur=cur->rlink;
        }

是错的。

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

代码语言:javascript
复制
        while(cur!=NULL)
        {
         prev=cur;
         if(ele<cur->data)
            cur=cur->llink;
         else
           cur=cur->rlink;
        }

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

如果忽略参数并无限地打印root,则应该使用一个参数来指定应该打印哪个节点。

使用llink twich也很奇怪。

它可以是这样的:

代码语言:javascript
复制
void inorder(bstnode* node)
{
    if(node==NULL)
    {
        return;
    }
    else{
        inorder(node->llink); 
        printf("\n%d",node->data);
        inorder(node->rlink);
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64104585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档