中序遍历,即遍历顺序为:左节点、根节点、右节点。
二叉树节点:
public class Node {
public Node left;
public Node right;
public int val;
public Node(int data){
this.val = data;
}
}
1. 递归方式
2. 非递归方式
借助数据栈。步骤:
当根节点非空时,申请一个数据栈;
在【栈非空 或 head非空】时,重复执行下述操作:
1). 如果head非空,把它压入栈中,并让head指向它的左孩子。
2). 如果head为空,弹出栈顶节点,用head保存该节点,并打印该节点的值,并让head指向它的右孩子。
在压栈操作后,head指向左孩子,在出栈操作后,head指向右孩子,所以head已经不代表根节点,而是作为一个临时指针节点,
从而把左孩子依次压入栈,直到左孩子为空,然后出栈,在出栈的时候用head保存弹出的节点,打印其数值,并指向该节点的右孩子,如果其右孩子不为空,则符合while循环条件,重复执行压栈操作~
代码:
import java.util.Stack;
/*中序遍历:递归方式和非递归方式,打印二叉树节点的值
* 参数:根节点
* 输出:void
*/
public class InOrder {
//中序遍历,递归方式
public static void inOrderRecursion(Node head){
if(head == null){
System.out.println("二叉树为空");
return;
}
if(head.left != null){
inOrderRecursion(head.left);
}
System.out.print(head.val+", ");
if(head.right != null){
inOrderRecursion(head.right);
}
}
-------------------------------------
//中序遍历,非递归方式
public static void inOrder(Node head){
if(head == null){
System.out.println("二叉树为空");
return;
}
System.out.println("中序遍历,非递归方式");
Stack<Node> s = new Stack<Node>();
while( !s.isEmpty() || head !=null ){
if(head !=null){
s.push(head);
head = head.left;
}else{
head = s.pop();
System.out.print(head.val+", ");
head = head.right;
}
}
}
------------------测试-------------------
public static void main(String[] args) {
//创建二叉树节点
Node head = new Node(1);
Node n1 = new Node(2);
Node n2 = new Node(3);
Node n3 = new Node(4);
Node n4 = new Node(5);
Node n5 = new Node(6);
Node n6 = new Node(7);
//生成二叉树
head.left = n1;
head.right = n2;
n1.left = n3;
n1.right = n4;
n2.left = n5;
n2.right = n6;
//递归方式中序遍历二叉树
inOrderRecursion(head);
System.out.println();
System.out.println();
//递归方式中序遍历二叉树
inOrder(head);
}
}
本例创建了一个包含有7个节点的完全二叉树:
运行结果:
过程示意图: