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循环,判断栈为空,结束;
在这里插入图片描述

更多的教程请关注:非科班的科班,今日分资源分享vue实战视频教程,获取方式后台回复:vue,即可获得

在这里插入图片描述

  • 19
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值