import java.util.ArrayDeque;
import java.util.Deque;
//二叉树的遍历
public class TwotreeTraversal {
public static void main(String[] args) {
MyNode h = new MyNode("H", null, null);
MyNode g = new MyNode("G", null, null);
MyNode i = new MyNode("I", null, h);
MyNode c = new MyNode("C", g, i);
MyNode e = new MyNode("E", null, null);
MyNode f = new MyNode("F", e, null);
MyNode d = new MyNode("D", null, null);
MyNode b = new MyNode("B", d, f);
MyNode a = new MyNode("A", b, c);
System.out.println("先序遍历如下:");
xianxu(a);
System.out.println("中序遍历如下:");
zhongxu(a);
System.out.println("后续遍历如下:");
houxu(a);
}
// 先序遍历 根>左>右
public static void xianxu(MyNode myNode) {
// 递归退出条件
if (myNode == null) {
return;
}
// 访问本节点
myNode.visit();
// 访问左子节点
xianxu(myNode.getLeft());
// 访问右子节点
xianxu(myNode.getRight());
}
// 中序遍历 左>根>右
public static void zhongxu(MyNode myNode) {
Deque<MyNode> deque = new ArrayDeque<MyNode>();
// 如果当前节点不为空,或者deque.size>0循环一直继续
while (myNode != null || deque.size() > 0) {
while (myNode != null) {
// 将一个节点压入deque
deque.push(myNode);
// 返回他的左节点
myNode = myNode.getLeft();
}
// 此时中序遍历已经到达最左边节点
if (deque.size() > 0) {
// 将一个节点弹出deque
myNode = deque.pop();
myNode.visit();
// 返回它的右节点
myNode = myNode.getRight();
}
}
}
// 后序遍历 左>右>根
// 采用双栈的思路,先遍历右子节点,再左节点,然后将其顺序存储在另一个栈中,该栈的弹栈顺序就是后序遍历顺序
public static void houxu(MyNode myNode) {
Deque<MyNode> deque = new ArrayDeque<>();
Deque<MyNode> reverseDeque = new ArrayDeque<>();
while (myNode != null || deque.size() > 0) {
while (myNode != null) {
//将该节点push进两个deque
deque.push(myNode);
reverseDeque.push(myNode);
//返回右子节点
myNode = myNode.getRight();
}
// 此时中序遍历已经到达最右边节点
if (deque.size() > 0) {
myNode = deque.pop();
myNode = myNode.getLeft();
}
}
while (reverseDeque.size() > 0) {
myNode = reverseDeque.pop();
myNode.visit();
}
}
}
public class MyNode {
private String value;
private MyNode left;
private MyNode right;
public MyNode(String value, MyNode left, MyNode right) {
this.value = value;
this.left = left;
this.right = right;
}
//访问value值
public void visit() {
System.out.print(value+" ");
}
//获取左节点
public MyNode getLeft() {
return left;
}
//获取右节点
public MyNode getRight() {
return right;
}
}
先序遍历
中序遍历
后序遍历