Java实现二叉树中序遍历(递归+非递归)

一、中序遍历(递归)

实现的思路和前序遍历其实差不多,但是访问的顺序就是:左节点->根节点->右节点,为了节省一些篇幅把节点数设置的少一些,重在大家的理解,话不多说直接上代码:

public void inOrderRecur(Node root) {
        if (root == null) {
            return;
        }
        inOrderRecur(root.left);
        System.out.print(root.data + " -> ");
        inOrderRecur(root.right);
    }

结构图

在这里插入图片描述

图解
第一步:
(1)执行inOrderRecur(Node root)方法,root不为null,于是调用preOrderRecur(root.left)方法,访问节点B;
(2)B不为空,继续调用inOrderRecur(B.left)方法,访问节点D;
(3)D不为空,调用inOrderRecur(D.left)方法,为空,返回;
(4)打印“D”。
在这里插入图片描述

第二步:
(1)然后调用inOrderRecur(D.right)方法,为空,返回;
(2)该层执行完毕,返回上一层,打印“B”
在这里插入图片描述

第三步:
(1)然后调用inOrderRecur(B.right)方法,访问到“E”,然后调用inOrderRecur(E.left),为空,打印“E”;
(2)然后调用inOrderRecur(E.right)方法,为空,返回;
在这里插入图片描述

第四步:
(1)执行完该层,返回上一层B层,B层也执行完毕,返回上一层A层,打印“A”;
在这里插入图片描述

第五步:
(1)然后调用inOrderRecur(A.right)方法,访问到C,再调用inOrderRecur(C.left),访问到F,再调inOrderRecur(F.left),为空,返回,打印“F”;
在这里插入图片描述

第六步:
(1)然后调用inOrderRecur(F.right)方法,为空返回,该层执行完毕,返回上一层C,打印“C”;
在这里插入图片描述

第七步:
(1)然后调用inOrderRecur(C.right)方法,访问到G,在调用inOrderRecur(G.left),为空返回,打印“G”;
(2)然后调用inOrderRecur(G.right)方法,为空,返回;
(2)G层执行完毕,返回上一层C层,C曾也执行完毕,返回上一层A层,A层也执行完毕,最后跳出递归,结束;
在这里插入图片描述

最后输出结果为:DBEAFCG

二、中序遍历(非递归)

public void inOrder() {
        Node current = root;
        //把LinkedList作为栈使用
        LinkedList<Node> s = new LinkedList<Node>();
        while (current != null || !s.isEmpty()) {
            while (current != null) {
                s.addFirst(current);
                current = current.left;
            }
            if (!s.isEmpty()) {
                current = s.removeFirst();
                System.out.print(current.data + " -> ");
                current = current.right;
            }
        }
    }

结构

在这里插入图片描述

图解
第一步:
(1)s.addFirst(current);
(2)A.left不为空,把节点B放入栈中;
(3)B.left不为空,把节点D放入一栈中;
在这里插入图片描述

第二步:
(1)D.left为空,跳出里层的while循环,输出“D”;
在这里插入图片描述

第三步:
(1)D.right为空,跳出里层的while循环,输出B;
在这里插入图片描述

第四步:
(1)B.right访问到E,E进入栈内;
在这里插入图片描述

第五步:
(1)B.right访问到E,E进入栈内;
(2)E.left为空,跳出里层的while循环,输出“E”;
在这里插入图片描述

第六步:
(1)E.right为空,跳出里层的while循环,输出“A”;
在这里插入图片描述

第六步:
(1)A.right访问到C,C进入栈;
在这里插入图片描述

第六步:
(1)C.left访问到F,F进入栈;
在这里插入图片描述

第六步:
(1)F.left为空,跳出里层的while循环,输出“F”;
在这里插入图片描述

第七步:
(1)F.right为空,跳出里层的while循环,输出“C”;
在这里插入图片描述

第八步:
(1)C.right不为空,访问到G,G进入栈;
在这里插入图片描述

第九步:
(1)G.left为空,跳出里层的while循环,输出G;
(2)G.right为空,跳出里层的while循环,判断栈为空,结束;
在这里插入图片描述

1、每日一荐 2020-03 汇总

2、『不要再问我头像如何变灰了,试试这几种滤镜吧!』

3、LeetCode专题 - 小岛题

4、一文带你AC四道题【位运算】

5、或许是一本可以彻底改变你刷 LeetCode 效率的题解书

6、外部排序:如何用 2GB内存给 20 亿个整数排序?

如果觉得文章不错,帮忙点个在看呗

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值