非递归后序遍历代码,请问bug出在哪里?

发布于 2022-09-01 05:39:33 字数 1438 浏览 18 评论 0

java    public static void postOrderNonrecur(Treenode rootnode){
        if(rootnode==null){
            return;
        }   
        Stack<Treenode> stack = new Stack<Treenode>();
        Treenode current = rootnode;
        while(current !=null || stack.isEmpty()!=true){     
            //step 1 
            while(current!=null){   
                if(current.rightchild!=null){
                    stack.push(current.rightchild);
                }
                stack.push(current);
                current = current.leftchild;
            }


            current = stack.pop();
            if(current.rightchild!=null && current.rightchild  == stack.peek() ){
                 System.out.println("here");
                    stack.pop(); //出栈右孩子
                    stack.push(current);
                    current = current.rightchild;
            }
            else{
                System.out.println(current.value);
                current = null;
            }
        }
    }

测试用例是
图片描述
出错是:
Exception in thread "main" 4
7
8
6
12
16
14
java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at gsm.Tree.postOrderNonrecur(Tree.java:110)
at gsm.Tree.main(Tree.java:140)
请问代码哪里出错了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

べ繥欢鉨o。 2022-09-08 05:39:33

按你的用例 在纸上走了一遍, 逻辑应该没有错. 有一个bug:

在node 14 处理后, 栈里只有 10 一个元素了, currentnull; 接着一个循环,

current = stack.pop();

为10, 栈为空.
所以下面的code应该是:

if(current.rightchild!=null && !stack.isEmpty() && current.rightchild == stack.peek() ){

电影里的梦 2022-09-08 05:39:33

见正确回复

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文