一、中序遍历(递归)
实现的思路和前序遍历其实差不多,但是访问的顺序就是:左节点->根节点->右节点,为了节省一些篇幅把节点数设置的少一些,重在大家的理解,话不多说直接上代码:
public void inOrderRecur(Node root) {
if (root == null) {
return;
}
inOrderRecur(root.left);
System.out.print(root.data + " -> ");
inOrderRecur(root.right);
}
结构图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3bb10b79c450feccb854bcb45e7bc6f9.png)
图解
第一步:
(1)执行inOrderRecur(Node root)方法,root不为null,于是调用preOrderRecur(root.left)方法,访问节点B;
(2)B不为空,继续调用inOrderRecur(B.left)方法,访问节点D;
(3)D不为空,调用inOrderRecur(D.left)方法,为空,返回;
(4)打印“D”。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5f7b1092c9681b7476c0a6d0ca6134c2.png)
第二步:
(1)然后调用inOrderRecur(D.right)方法,为空,返回;
(2)该层执行完毕,返回上一层,打印“B”
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f6ac8aa0e3b3008c8201846383c9fddd.png)
第三步:
(1)然后调用inOrderRecur(B.right)方法,访问到“E”,然后调用inOrderRecur(E.left),为空,打印“E”;
(2)然后调用inOrderRecur(E.right)方法,为空,返回;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/77e5e6f15f9684e54ce40b6834c21bf8.png)
第四步:
(1)执行完该层,返回上一层B层,B层也执行完毕,返回上一层A层,打印“A”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/23d98264ee6a563f12d850a92afbcbf8.png)
第五步:
(1)然后调用inOrderRecur(A.right)方法,访问到C,再调用inOrderRecur(C.left),访问到F,再调inOrderRecur(F.left),为空,返回,打印“F”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c09f235170cd81c11e1862169ea90c5.png)
第六步:
(1)然后调用inOrderRecur(F.right)方法,为空返回,该层执行完毕,返回上一层C,打印“C”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c78d923ab06029781f62024c2b627448.png)
第七步:
(1)然后调用inOrderRecur(C.right)方法,访问到G,在调用inOrderRecur(G.left),为空返回,打印“G”;
(2)然后调用inOrderRecur(G.right)方法,为空,返回;
(2)G层执行完毕,返回上一层C层,C曾也执行完毕,返回上一层A层,A层也执行完毕,最后跳出递归,结束;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ab0550b3ae200d9550cb141a8fb72186.png)
最后输出结果为: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;
}
}
}
结构
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d22fa02b1ada98a9ad39a652a64e0c1a.png)
图解
第一步:
(1)s.addFirst(current);
(2)A.left不为空,把节点B放入栈中;
(3)B.left不为空,把节点D放入一栈中;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5a458108c31f35748638cba04d39d1ba.png)
第二步:
(1)D.left为空,跳出里层的while循环,输出“D”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d9753c21ad201b3c9e595349d5429e03.png)
第三步:
(1)D.right为空,跳出里层的while循环,输出B;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/862fd2bfc02f3d2fe674188ed11024f9.png)
第四步:
(1)B.right访问到E,E进入栈内;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c5ec72a3d4f5706d2f40035fe9d83a44.png)
第五步:
(1)B.right访问到E,E进入栈内;
(2)E.left为空,跳出里层的while循环,输出“E”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/27f7c3c006600cb50601e9b4a2f8aa57.png)
第六步:
(1)E.right为空,跳出里层的while循环,输出“A”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/16592649dae91eb31bc661e1cd3cee80.png)
第六步:
(1)A.right访问到C,C进入栈;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ab62c6d28804cbb46be1db5ba4555147.png)
第六步:
(1)C.left访问到F,F进入栈;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d161e1a7c6c4d1328e7e5d406cfabc2e.png)
第六步:
(1)F.left为空,跳出里层的while循环,输出“F”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b6505b189585e0b8043dec15b96e6837.png)
第七步:
(1)F.right为空,跳出里层的while循环,输出“C”;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e130db00ec0bb212320716066b6d25cb.png)
第八步:
(1)C.right不为空,访问到G,G进入栈;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0ec2952285f2d9b6937cc40990b894c3.png)
第九步:
(1)G.left为空,跳出里层的while循环,输出G;
(2)G.right为空,跳出里层的while循环,判断栈为空,结束;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f37c87b2d3f8c93ddc3db6ece7443e25.png)
5、或许是一本可以彻底改变你刷 LeetCode 效率的题解书
如果觉得文章不错,帮忙点个在看呗