繁体   English   中英

二元搜索树postorder迭代遍历

[英]binary search tree postorder traversal by iteration

我实现了迭代后序算法以及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视为全局(在我的代码中,上面的代码片段是类的一部分,因此是root变量)

问题出在这一行:

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. push root(堆栈现在有A,root)
  3. pop root(堆栈现在有A)
  4. pop A(堆栈现在为空)
  5. 推根(堆栈现在有根)
  6. 推A(堆栈有根,A)
  7. 弹出A并打印A的数据(堆栈有root)
  8. pop root(堆栈现在为空)
  9. 在这个阶段,程序有一个空堆栈,t-> r!= NULL,因此它将访问st.top

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM