一、中序遍历(递归)
实现的思路和前序遍历其实差不多,但是访问的顺序就是:左节点->根节点->右节点,为了节省一些篇幅把节点数设置的少一些,重在大家的理解,话不多说直接上代码:
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,即可获得