C++ 二叉搜索树的迭代后序遍历

C++ 二叉搜索树的迭代后序遍历,c++,algorithm,data-structures,binary-tree,binary-search-tree,C++,Algorithm,Data Structures,Binary Tree,Binary Search Tree,我实现了一个迭代的后序算法以及pre和inoorder。但是迭代后序不起作用。我所有的努力都是徒劳的。 程序在按post顺序打印树的最后一个节点数据之前崩溃 这是代码片段 t=root; while(t!=NULL || !st.empty()) { if(t!=NULL) { if(t->r!=NULL) st.push(t->r); st.push(t

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

这是代码片段

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;
            }
        }
    }
t=root;
while(t!=NULL | |!st.empty())
{
如果(t!=NULL)
{
如果(t->r!=NULL)
圣推(t->r);
圣普什(t);
t=t->l;
}
其他的
{
t=圣托普();
圣普();
如果(t->r!=NULL&&t->r==st.top())
{
圣普();
圣普什(t);
t=t->r;
}
其他的
{

cout问题出在这一行:

if(t->r!=NULL && t->r==st.top())
问题是堆栈此时可能为空,在这种情况下,调用st.top()将导致程序崩溃

您可以通过将行更改为:

if(t->r!=NULL && !st.empty() && t->r==st.top())
例子 如果树的左边根连接到NULL,右边是A,则程序将:

  • 推送A(堆栈现在有A)
  • 推根(堆栈现在有一个,根)
  • pop root(堆栈现在有一个
  • 弹出A(堆栈现在为空)
  • 推根(堆栈现在有根)
  • 推送A(堆栈有根,A)
  • 弹出A并打印A的数据(堆栈有根)
  • pop root(堆栈现在为空)
  • 在这个阶段,程序有一个空堆栈,t->r!=NULL,因此它将访问st.top

  • 清理代码并显示相关的parts@ScarletAmaranth现在可以了,还是我应该完全删除没有显示错误的部分。删除所有不相关的内容,我在那里看到一些预排序和无序的内容,让它消失,删除,删除,根除,garfunkle,你有什么,显示导致错误和/或潜在错误的代码立即调用堆栈候选者如果您不完全确定错误发生的位置或原因,是否确定此处正确执行了后序遍历?此算法似乎不正确支持处理树的右侧。@WLin否,我使用递归后序检查了大量输入。它你能想到其他错误吗?因为我花了很多时间来证明堆栈不会是空的。更多信息:最初堆栈是空的。顺便问一下,当你运行程序时,更改是否修复了它?