Итеративный обход предварительного заказа

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

struct BTnode{
     int data;
     struct BTnode* left;
     struct BTnode* right;
     struct BTnode* parent;
}; 
typedef struct BTnode BTnode_t; 


  typedef struct {
      LL_t* list;
  } stack_t;  //stack is created with a Linked List


void preOrderIter(BTnode_t* root)
{
    stack_t* s = stack_create();
    stack_push(s, root->data); 
    BTnode_t* current;

    while (!stack_is_empty(s))
    {
        current = stack_pop(s);
        printf("%d ", current->data); 

        if ( current->right != NULL)
            stack_push(s, current->right->data);

        if ( current->left != NULL)
            stack_push(s, current->left->data); 
    }

    free(s);
}

person Mikhail Alexeev    schedule 28.10.2018    source источник
comment
Каковы определения BTnode_t и stack_t?   -  person Fiddling Bits    schedule 29.10.2018
comment
BTnode_t — это структура двоичного дерева, а stack_t — это структура стека.   -  person Mikhail Alexeev    schedule 29.10.2018
comment
Это бесполезно. Можете ли вы добавить определение к вашему вопросу? например struct BTnode_t {...};   -  person Fiddling Bits    schedule 29.10.2018
comment
stack_push(s, root->data); выглядит подозрительно для меня. Вы открываете его, а затем пытаетесь -> с данными... Похоже, вам нужно stack_push(s, root); , не так ли? Если это не проблема, опубликуйте MCVE, чтобы мы могли запустить ваш код и воспроизвести проблему. Спасибо и добро пожаловать в SO!   -  person ggorlen    schedule 29.10.2018
comment
В какой строке возникает ошибка? если вы не уверены, используйте трассировку программы с помощью отладчика и посмотрите, где она останавливается.   -  person Arya11    schedule 29.10.2018
comment
ошибка выдается двумя операторами if, так как я не даю текущей переменной правильное значение   -  person Mikhail Alexeev    schedule 29.10.2018


Ответы (1)


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

void preOrderIter(BTnode_t* root)
{
  stack_t* s = stack_create();
  stack_push(s, root); 
  BTnode_t* current;

  while (!stack_is_empty(s))
  {
    current = stack_pop(s);
    printf("%d ", current->data); 

    if ( current->right != NULL)
        stack_push(s, current->right);

    if ( current->left != NULL)
        stack_push(s, current->left); 
  }

  free(s);
}

Это то, что вам нужно исправить в конечном итоге, но я не уверен, исправит ли это вашу ошибку ошибки сегментации.

person Seçil    schedule 28.10.2018