Обход pre_order с использованием стека в c - PullRequest
0 голосов
/ 31 июля 2011

Я не могу понять, почему программа печатает только первые 3 символа дерева. Пожалуйста, помогите.

#include <stdio.h>
#include <malloc.h>

struct node
{
    struct node *left;
    char data;
    struct node *right;
};

struct node *buildtree(int);
void pre_order(struct node*);

char  a[]={'a','b','c','d','e','f','g','\0','\0','h','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};

int main()
{
    struct node *root;
    root = buildtree(0);
    printf("pre order traversal:\n");
    pre_order(root);
}

struct node *buildtree(int n)
{
    struct node *temp = NULL;
    if(a[n]!='\0')
    {
        temp=(struct node*)malloc(sizeof(struct node));
        temp->left=buildtree(2*n+1);
        temp->data=a[n];
        temp->right=(2*n+2);
    }

    return temp;
}

void pre_order(struct node* root)
{
    char stack[30];
    struct node* ptr;
    int top=1;
    stack[1]=NULL;
    ptr=root;

    while(ptr!=NULL)
    {
        printf("%c",ptr->data);
        if(ptr->right!=NULL)
        {
            top=top+1;
            stack[top]=ptr->right;
        }

        if(ptr->left!=NULL)
            ptr=ptr->left;
        else
        {
            ptr=stack[top];
            top=top-1;
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Я удивлен, что скомпилированный

char stack[30];

должен быть заменен на

struct node* stack[30];

Могут быть другие проблемы.

Вы написали хорошую рекурсивную подпрограмму дляпостройте дерево, почему бы не написать рекурсивную подпрограмму для обхода предварительного заказа.Это было бы намного легче понять.

1 голос
/ 31 июля 2011

Простой вызов чего-то «стека» не заставит его вести себя как единое целое. Когда вы помещаете что-либо в стек, существующие значения выталкиваются вниз, и для всплывающего окна верно обратное.

Я бы начал с реализации рабочего стека, желательно с собственными функциями для отправки и извлечения информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...