Loading

二叉树三种遍历的非递归形式

前序遍历非递归算法

public void preOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归前序遍历
        LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
        while(true){
            while(root != null){
                System.out.println(root.getData());
                stack.push(root);
                root = root.getLeft();
            }
            if(stack.isEmpty())
                break;
            root = stack.pop().getRight();
        }
    }

中序遍历非递归算法

    public void inOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归中序遍历
        LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
        while(true){
            while(root != null){
                stack.push(root);
                root = root.getLeft();
            }
            if(stack.isEmpty())
                break;
            root = stack.pop();
            System.out.println(root.getData());
            root = root.getRight();
        }
    }

前序遍历和中序遍历的非递归很相似,只是输出的位置不一样而已,下面的后续遍历非递归有点难理解,不过感觉比数据结构课上学的简单。这是自己根据一本书上的改的:

后续遍历非递归算法

public void postOrderNonRecursion(BinaryTreeNode<T> root){ // 后序遍历非递归算法
        LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
        while(true){
            if(root != null){
                stack.push(root);
                root = root.getLeft();
            } else {
                while(!stack.isEmpty() && root == stack.getTop().getRight()){ // 判断右子树是否遍历完成
                    root = stack.pop();
                    System.out.println(root.getData());
                }
                // 判断上述while循环退出的原因
                if(stack.isEmpty()) // 如果是因为栈为空,退出外层循环
                    break;
                else // 如果是因为右子树未遍历完,将右子树作为根结点循环
                    root = stack.getTop().getRight();
            }
        }
    }

我构造了如下二叉树来验证:
这里写图片描述
得到的结果:
这里写图片描述
当然,不排除有其他特例,如有错误,欢迎指正。
完整代码可以访问我的GitHub:https://github.com/StriverLi/Data-Structures-and-Algorithms-in-Java/blob/master/src/tree/BinaryTreeNode.java

posted @ 2017-04-06 14:15  leon_x  阅读(36)  评论(0)    收藏  举报