Обход post_order в C с использованием стека - PullRequest
1 голос
/ 03 августа 2011

Я пытался выполнить обход заказа с помощью стека ..... но я получаю сообщение об ошибке типа недопустимых операндов в двоичном виде ,,,,,,,,, пожалуйста, скажите мне, как преодолеть эту ситуациюниже код.

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

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

struct node *buildtree(int);
void post_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");
    post_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 = buildtree(2*n+2);
    }

    return temp;
}

void post_order(struct node *root)
{
    struct node* stack[40];
    struct node* ptr;
    int top = 1;
    stack[1] = NULL;
    ptr = root;
    while(ptr != NULL)
    {
        top = top + 1;
        stack[top] = ptr;

        if((ptr->right) != NULL)
        {
            top = top + 1;
            stack[top] = -1 * (ptr->right);//how can i assign negative values on the stack.
        }

        ptr = ptr->left;
    }

    ptr = stack[top];
    top = top - 1;

    while(ptr > 0)
    {
        printf("%c", ptr->data);
        ptr = stack[top];
        top = top - 1;
    }

    if(ptr < 0)
    {
        ptr = (-1) * (ptr);
        while(ptr != NULL)
        {
            top = top + 1;
            stack[top] = ptr;
            if(ptr->right != NULL)
            {
                top = top + 1;
                stack[top] = (-1) * (ptr->right);
            }

            ptr = ptr->left;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 июня 2013

Узел Struct - это определенный пользователем объект, и вы пытаетесь применить к нему оператор умножения.Объявите целочисленный массив или целое число стека и преобразуйте указатель в целое число и поместите его в стек.Во время popping преобразуйте целое число в узел struct *, как показано ниже.

int x = reinterpret_cast<int>(<your struct node pointer>);
x= x* -1;
push(x);

в popping

int y = pop();
y= y*-1;
struct node *n = reinterpret_cast<struct BTNode*>(y);

Таким образом вы можете решить эту проблему.

0 голосов
/ 03 августа 2011

Посмотрите на эту ветку.Они обсуждают пост-порядок обхода бинарных деревьев без рекурсии.Принятый ответ дает ссылку на решения на основе стека.

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