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

难易程度:★★

重要性:★★★★★

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

/**
     * 非递归版本的中序遍历
     * 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、大数据项目资料很全,你想找的几乎都有

转载于:https://juejin.im/post/5cbd75e4f265da03a22f6421

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值