之前的文章中简单介绍过二叉树的数据结构和先、中、后序的不同实现方式。二叉树和递归序
其中先、中、后序三种方式都是由递归序转化而来,通过递归的方式遍历整棵二叉树,并通过到达每个节点第几次的次数,来达到先、中、后序的实现。
在那篇文章中,是通过递归的方式来实现的先、中、后序树的打印。这篇文章会通过改写递归,用普通的方法来通过先、中、后序的方式打印二叉树。
先序
使用栈的方式来实现,先进后出,如果右侧节点不为null,则先压入右侧节点。
public static void pre(Node head){
if (head == null) {
return;
}
Stack<Node> stack = new Stack();
stack.add(head);
while (!stack.isEmpty()) {
Node cur = stack.pop();
System.out.print(cur.val + " ");
if (cur.right != null) {
stack.push(cur.right);
}
if (cur.left != null) {
stack.push(cur.left);
}
}
}
后序
先将树按照 头 -》 右 -》 左的方式放入第一个栈中, 遍历第一个栈,并将弹出的元素依次放入第二个栈:此时第二个栈内的元素顺序就是 头 -》 右 -》左, 再遍历第二个栈,先进后出 ,遍历出来的顺序就是 左 -》 右 -》 头。以此来达到后序的目的。
public static void pos1(Node head) {
if (head != null) {
Stack<Node> s1 = new Stack<>();
Stack<Node> s2 = new Stack<>();
s1.add(head);
while (!s1.isEmpty()) {
Node cur = s1.pop();
s2.add(cur);
if (cur.left != null) {
s1.push(cur.left);
}
if (cur.right != null) {
s1.push(cur.right);
}
}
while (!s2.isEmpty()){
System.out.print(s2.pop().val + " ");
}
System.out.println();
}
}
中序
中序照比先序和后续复杂些,整体思路是这样:
先将整棵二叉树全部按照左树进行划分,当前节点如果有左子节点,则将当前节点压栈,并将当前节点等于左子节点,将左子节点全部压栈。直到左子节点为null,左子节点为null后直接从栈中弹出元素,并将当前节点等于右子节点,如果右子节点还有左树,则继续压栈,没有则直接弹出。
public static void in(Node head){
if (head != null){
Stack<Node> stack = new Stack<>();
while (!stack.isEmpty() || head != null){
if (head != null){
stack.add(head);
head = head.left;
}else{
head = stack.pop();
System.out.print(head.val + " ");
head = head.right;
}
}
System.out.println();
}
}