前序遍历(二叉树)——迭代法

时间:2021-03-20 06:50:18

标签: c++ data-structures tree

我正在实现二叉树的先序遍历(无递归)。以下代码陷入无限循环。我无法理解发生了什么

void Tree::n_preorder()
{
    Node* temp;        
    stack s;
    cout<<"\nPreorder: ";
    while(1)
    {
        s.push(root);
        while(1)
        {
            temp = s.pop();
            cout<<temp->data;
            if(temp->right)
            {
                s.push(temp->right);        //Push right child
            }
            if(s.isEmpty())
            {
                break;
            }
            if(temp->left)
            {
                s.push(temp->left);         //Push left child
            }
        }
    }
}

堆栈的isEmpty()函数

int isEmpty()
{
  return top==-1;
}

1 个答案:

答案 0 :(得分:1)

外循环永远不会退出:它的 while 条件始终为真,并且没有 break。您拥有的唯一 break 会跳出内部循环,但不会跳出外部循环。

您不应该需要嵌套循环来执行此操作。当您只有一个循环时,如果不将左孩子放在堆栈上就中断它是没有意义的,因此请删除该条件中断,并将 !s.isEmpty() 作为循环的条件:

void Tree::n_preorder()
{
    Node* node;        
    stack nodeStack;
    cout << "\nPreorder:";
    nodeStack.push(root);
    while (!nodeStack.isEmpty())
    {
        node = nodeStack.pop();
        cout << " " << node->data;
        // As a stack is LIFO (last-in-first-out), we add the node's children 
        // on the stack in reversed order, so they get output in the correct order.
        if (node->right)
        {
            nodeStack.push(node->right);
        }
        if (node->left)
        {
            nodeStack.push(node->left);
        }
    }
}

其他一些说明:

  • 我觉得像“推左孩子”这样的评论没有用...因为那只是在重复——几乎是逐字逐句——人们已经可以在相应的代码行。应该对更高级别的抽象进行评论,并就“为什么?”给出一些解释。我在上面的代码中添加了这样的注释来说明这一点。

  • 使用更具描述性的变量名称。 temps 没有赠送太多。

  • 您需要输出一个空格来分隔不同的数据输出。