繁体   English   中英

二叉树级顺序使用队列遍历?

[英]Binary Tree level order Traversal using queues?

请帮助我在代码中查找错误。 在此程序中,我创建了一个二叉树,我想使用队列按级别顺序遍历。

打印第一个父根后,我的输出卡住了。我认为Queue函数中犯了一些错误,但我找不到任何错误。

这是我的代码如下:


                #include<stdio.h>
                #include<stdlib.h>
                struct node
                {
                    int data;
                    struct node *left,*right;
                };
                struct node* create_root(int data)
                {
                struct node *root=(struct node*)malloc(sizeof(struct node));
                    root->data=data;
                    root->left=root->right=NULL;
                    return root;
                }
                struct node* create_tree(int data,struct node *root)
                {
                    char ch;
                 if(root==NULL)
                        return create_root(data);

                     printf("\nEnter R/L of %d ? ",root->data);
                     fflush(stdin);
                     scanf("%c",&ch);
                    if(ch=='R' || ch=='r')
                        root->right=create_tree(data,root->right);
                    else
                        root->left=create_tree(data,root->left);

                 return root;
                }
                struct queue
                {
                    struct node *info;
                    struct queue *next;
                };
                struct queue *start=NULL;
                struct queue* enQueue(struct node *root)
                {
                    struct queue *new_node,*ptr;
                    new_node=(struct queue*)malloc(sizeof(struct queue));
                    if(start==NULL)
                        start=new_node;
                    else
                    {
                        ptr=start;
                        while(ptr!=NULL)
                        {
                                if(ptr->next==NULL)
                                {
                                    ptr->next=new_node;
                                    new_node->next=NULL;
                                }
                        }
                    }
                    new_node->info=root;
                    return start;
                }
                struct queue* deQueue()
                {
                 struct queue *temp;
                        if(start==NULL)
                        {
                            printf("\nEmpty!!!!!");
                            return;
                        }
                        temp=start;
                        if(start->next==NULL) start=NULL;
                        else start=start->next;
                        return temp;

                }
                int isEmpty()
                {
                    if(start==NULL)
                        return 1;
                    else
                        return 0;
                }
                void level_order(struct node *root)
                {
                    struct queue *ptr;
                    if(root==NULL)
                    {
                        printf("\nEmpty!!!!!");
                        return ;
                    }
                    start=enQueue(root);
                    while(!isEmpty())
                    {
                        ptr=deQueue();
                        printf("%d ",ptr->info->data);

                        if(ptr->info->left)
                            enQueue(ptr->info->left);
                        else if(ptr->info->right)
                            enQueue(ptr->info->right);

                    }
                }
                int main()
                {
                    int n=0,num;
                    struct node *root=NULL;
                    printf("\nEnter data:");
                    scanf("%d",&num);
                    root=create_tree(num,root);
                    while(n<5)
                    {
                     printf("\nEnter data:");
                     scanf("%d",&num);
                     create_tree(num,root);
                     n++;
                    }
                    level_order(root);
                    return 0;
                }

您的enqueue函数已损坏:您继续循环直到ptrNULL ,但是在循环内部您根本不会更改ptr!

  while(ptr!=NULL)
    {
            if(ptr->next==NULL)
            {
                ptr->next=new_node;
                new_node->next=NULL;
            }
    }

取而代之的是,每次迭代都必须在列表中进行,直到到达终点为止:

    while(ptr!=NULL)
    {
            if(ptr->next==NULL)
            {
                ptr->next=new_node;
                new_node->next=NULL;
                break;
            }
            ptr = ptr->next;
    }

这应该解决无限循环。

此外,您应该将new_node->next的初始化直接移动到malloc() ,以便在start == NULL的情况下也进行初始化:

new_node=(struct queue*)malloc(sizeof(struct queue));
new_node->next = NULL;
if(start==NULL)
      start=new_node;

level_order应该对自身进行递归调用,而不是对enqueue()进行调用。

暂无
暂无

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

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