【问题标题】:preorder traversal using stack使用堆栈的前序遍历
【发布时间】:2019-06-14 18:40:33
【问题描述】:

我正在尝试实现二叉树,使用堆栈进行前序遍历。 这里它弹出最后一个左节点,之后 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;
            }

【问题讨论】:

    标签: data-structures tree stack iteration preorder


    【解决方案1】:

    您的逻辑是正确的,但您的代码中有一些错误。

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

    在尝试访问根->数据之前,您应该检查根是否为空。这就是您遇到分段错误的原因。所以在printf() 语句上面加上一个条件if(root!=NULL)

    另一个错误是在栈的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 的值保持不变。

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 2016-07-14
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多