非递归方式实现二叉树的前、中、后序遍历

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。非递归方式实现二叉树的前、中、后序遍历,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

各位朋友们,大家五一快乐,今天我为大家分享的是不用递归的方式实现二叉树的前、中、后序遍历,一起来看看吧。

二叉树的前序遍历

虽然我们说的是不用递归的方式实现,但是我们的思路还是模拟递归的实现,那么我们如何不用递归来模拟实现递归呢?我们要想模拟递归,我们需要知道实现递归的底层逻辑是什么?递归实际上是通过栈这个数据结构来实现的,我们都知道递归的顺序是先完成后递归的,这也就跟栈先进后出的原理是类似的,所以我们想模拟递归,也需要借用栈这个数据结构。

在知道了原理之后,我们接下来就需要知道怎么样来实现了,因为这里是前序遍历,先遍历根节点,然后是左子树,最后是右子树,所以我们先遍历左子树,并且在遍历的同时我们将遍历的节点存储在栈中并打印,方便我们找到节点的右子树。当我们的root遍历到为null时,就说明左树遍历完了,我们就将栈顶的节点弹出,将root等于弹出节点的右子树,直到root等于null并且栈为空时完成遍历。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
节点6的右树也为null,所以我们弹出栈顶的元素,cur = top.right,继续上面操作。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

public void preOrderNor(TreeNode root) {
        if(root == null) {
            return;
        }
        TreeNode cur = root;
        Deque<TreeNode> stack = new ArrayDeque<>();
        while(cur != null || !stack.isEmpty()) {
            while(cur != null) {
                stack.push(cur);
                System.out.println(cur.val);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }

二叉树的中序遍历

中序遍历的思路跟前序遍历的思路是一样的,只是打印的顺序不同,我们在从栈中弹出节点的同时打印。

public void inOrderNor(TreeNode root) {
        if(root == null) {
            return;
        }
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            System.out.println(top.val);
            cur = top.right;
        }
    }

二叉树的后序遍历

后序遍历的思路跟前序和中序的思路是不同的,我们需要判断什么时候该打印,因为是后序遍历,所以我们需要在遍历完右树或者右树为null的时候在遍历根节点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public void postOrderNor(TreeNode root) {
        if(root == null) {
            return;
        }
        TreeNode cur = root;
        TreeNode prev = null;
        Deque<TreeNode> stack = new ArrayDeque<>();
        while(cur != null || !stack.isEmpty()) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.peek();
            if(top.right == null || top.right == prev) {
                System.out.println(top.val);
                stack.pop();
                prev = top;
            }else {
                cur = top.right;
            }
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/192645.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!