美文网首页应届生互联网求职面试总结分享
二叉树的中序遍历(递归和非递归版本)

二叉树的中序遍历(递归和非递归版本)

作者: 大菜鸟_ | 来源:发表于2018-10-27 16:27 被阅读0次

难易程度:★★

重要性:★★★★★

树结构是面试中的考察的重点,而树的遍历又是树结构的基础。中序遍历的非递归版本要求重点理解掌握。

/**
     * 非递归版本的中序遍历
     * node指向待处理的节点,在中序遍历中如果要输出一个节点,要么该节点没有左孩子,要么该节点的左子树已经全部输出了。
     *所以:
     *1.当node为null时,表示暂时没有新节点处理,此时出栈一个节点(表明该节点没有左子树或者左子树全部处理了);
     *    这时只需要继续处理右子树即可, 中序是“左根右”:我们先入栈 根节点 ,如果有左节点则入栈左节点,
     *    否则出栈根节点(没有左节点则输出遍历根节点),之后处理右子树
     *2.当node不为null时,将node入栈,并将node指向node.left,表明要处理当前节点必须先处理左子树节点
     * 
     * @param root:根节点
     */
    public static List<Integer> midOrderTraverse(TreeNode root) {
        LinkedList<Integer> res = new LinkedList<Integer>();

        if (root == null)
            return res;

        Stack<TreeNode> aux = new Stack<TreeNode>();
        TreeNode node = root;//node指向待处理节点

        while (node != null || !aux.isEmpty()) {
            while (node != null) {
              //当前节点不为null,将当前节点入栈等到该节点的左子树全部处理完后在处理当前节点
                aux.add(node);
                node = node.left;//先处理左孩子节点
            }
            TreeNode temp = aux.pop();
            res.add(temp.val);//node没有左孩子,则输出当前node节点
            node = temp.right;//处理node的右子树
        }
        return res;
    }
    
    /**
     * 中序遍历,递归版本
     * @param root
     * @return
     */
    public static ArrayList<Integer> midOrderTraverse(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<Integer>();

        midOrderTraverse(root, res);
        return res;
    }

    private static void midOrderTraverse(TreeNode root, ArrayList<Integer> res) {
        if (root == null)
            return;

        preOrder(root.left);
        res.add(root.val);
        preOrder(root.right);
    }

扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享
公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

相关文章

  • 根据两个traversal恢复二叉树

    已知前序和中序遍历: 递归版本: 非递归版本: 已知后序和中序遍历:非递归:

  • python遍历二叉树

    定义二叉树: 构建二叉树: BFS: 先序遍历:1.递归版本: 2.非递归版本: 中序遍历: 1.递归版本 2.非...

  • 二叉树的前中后三种遍历(递归、非递归和Morris)

    前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 Morris 遍历待补充 后序遍历 递归版本 非递...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树的遍历算法

    递归版本 先序遍历: 中序遍历: 后序遍历: 非递归版本 先序遍历: 中序遍历: 后序遍历: 层次遍历:

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • LeetCode 二叉树的中序遍历(递归和非递归算法)

    二叉树的中序遍历给定一个二叉树,返回它的中序 遍历。示例: 非递归(思路更清晰): 非递归: 递归:

网友评论

    本文标题:二叉树的中序遍历(递归和非递归版本)

    本文链接:https://www.haomeiwen.com/subject/ejpdtqtx.html