【问题标题】:PreOrder Iterative TraversalPreOrder 迭代遍历
【发布时间】:2018-10-28 21:30:41
【问题描述】:

这种迭代二叉树遍历不断给我分段错误错误,我不确定如何将树中当前变量的指针分配给从中弹出的元素,因为它们是 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);
}

【问题讨论】:

  • BTnode_tstack_t的定义是什么?
  • BTnode_t 是二叉树结构,stack_t 是堆栈结构
  • 这没有帮助。您可以将定义添加到您的问题中吗?例如struct BTnode_t {...};
  • stack_push(s, root->data); 在我看来很可疑。你弹出它,然后用数据尝试->...看起来你想要stack_push(s, root); ,不是吗?如果这不是问题,请发布MCVE,以便我们实际运行您的代码并重现问题。谢谢你,欢迎来到 SO!
  • 错误发生在哪一行?如果您不确定使用调试器跟踪程序并查看它停止的位置。

标签: c tree binary iteration preorder


【解决方案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);
}

这是您最终需要解决的问题,但我不确定这是否会解决您的分段错误错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多