предварительный заказ с использованием стека - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь реализовать двоичное дерево, обход по предварительному заказу с использованием стека.здесь он выталкивает последний левый узел, и после этого root = root-> right не работает.Пожалуйста, помогите.здесь 7 выводится и отображается и после завершения программы.

все функции работают, но не желаемый вывод

            #include<stdio.h>
            #include<stdlib.h>
            #define maxsize 100
            int a[maxsize];
            int top=-1;
            struct node{
                int data;
                struct node *left, *right;
            };
            struct node *newNode(int data)
            {
                struct node *nn;
                nn=(struct node *)malloc(sizeof(struct node));
                if(!nn)
                    return;
                nn->data=data;
                nn->left=nn->right=NULL;
                return nn;
            };
            void push(struct node *root)
            {
                printf("pushcalled\n");
                if(top!=maxsize-1)
                    a[++top]=root;
            }
            int isempty()
            {
                return(top==-1);
            }
            struct node *pop()
            {
                printf("popcalled\n");
                if(top!=-1)
                {
                    return a[top];
                    top--;
                }
            }
            void deleteStack()
            {
                free(a[top--]);
            }
            void preorder(struct node *root)
            {
                while(1)
                {
                    while(root)
                    {
                        printf("%d\t",root->data);
                        push(root);
                        root=root->left;
                    }
                    printf("hello\n");
                    if(isempty())
                        break;
                    printf("hello\n");
                    root=pop();
                    printf("Popped data is:%d\n",root->data);
                    root=root->right;
                    printf("right data is:%d\n",root->data);
                }
                deleteStack();
            }
            int main()
            {
                int data;
                struct node *root=newNode(10);
                root->left = newNode(11);
                root->left->left = newNode(7);
                root->right = newNode(9);
                root->right->left = newNode(15);
                root->right->right = newNode(8);
                preorder(root);
                return 0;
            }

1 Ответ

0 голосов
/ 15 июня 2019

Ваша логика верна, но в вашем коде есть некоторые ошибки.

 root=root->right;
 printf("right data is:%d\n",root->data);

Вы должны проверить, является ли корень нулевым или нет, прежде чем пытаться получить доступ к root-> данным.Вот почему вы получаете ошибку сегментации.Поэтому поместите условие if(root!=NULL) выше printf() оператора.

Другая ошибка заключается в реализации pop стека.

       struct node *pop()
       {
            printf("popcalled\n");
            if(top!=-1)
            {
                return a[top];
                top--;
            }
        }

это должно быть так,

        struct node *pop()
        {
            printf("popcalled\n");
            if(top!=-1)
            {
                struct node* temp = a[top];
                top--;
                return temp;
            }
        }

В вашем коде, когда вы возвращаете a[top]; строка под ним, т.е. top--; никогда не выполняется и значение top остается неизменным.

...