二元搜索树postorder迭代遍历

时间:2014-01-05 20:01:39

标签: c++ algorithm data-structures binary-tree binary-search-tree

我实现了迭代后序算法以及pre和inorder。但迭代的后序不起作用。所有我的努力都是徒劳地发现错误。 程序在按顺序打印树的最后一个节点数据之前崩溃。

这是代码段。

t=root;

    while(t!=NULL || !st.empty())
    {
        if(t!=NULL)
        {
            if(t->r!=NULL)
                st.push(t->r);
            st.push(t);
            t=t->l;
        }
        else
        {
            t=st.top();
            st.pop();
            if(t->r!=NULL && t->r==st.top())
            {
                st.pop();
                st.push(t);
                t=t->r;
            }
            else
            {
                cout<<t->data<<" ";
                t=NULL;
            }
        }
    }

更多信息:st是STL堆栈并将root视为全局(在我的代码中,上面的代码片段是类的一部分,因此是根变量)

1 个答案:

答案 0 :(得分:2)

问题出在这一行:

if(t->r!=NULL && t->r==st.top())

问题是此时堆栈可能为空,在这种情况下调用st.top()会导致程序崩溃。

您可以通过将行更改为:

来解决此问题
if(t->r!=NULL && !st.empty() && t->r==st.top())

实施例

如果您的树的根目录在其左侧为NULL,而在其右侧为A,则程序将:

  1. 推送A(堆栈现在有A)
  2. 推根(堆栈现在有A,root)
  3. pop root(stack现在有A)
  4. pop A(堆栈现在为空)
  5. 推根(堆栈现在有根)
  6. 推送A(堆栈具有root,A)
  7. 弹出A并打印A的数据(堆栈具有root)
  8. pop root(堆栈现在为空)
  9. 在这个阶段,程序有一个空堆栈,t-&gt; r!= NULL,因此它将访问st.top