一、中序遍历(递归)
实现的思路和前序遍历其实差不多,但是访问的顺序就是:左节点->根节点->右节点,为了节省一些篇幅把节点数设置的少一些,重在大家的理解,话不多说直接上代码:
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循环,判断栈为空,结束;
在这里插入图片描述