在二叉树的先序、中序和后序这三种遍历方式中,所谓的“先”、“中”和“后”都是相对于“根节点”来说的,
因此,先序遍历,即遍历顺序为:根节点、左节点、右节点。
二叉树节点:
public class Node {
public Node left;
public Node right;
public int val;
public Node(int data){
this.val = data;
}
}
1. 递归方式
二叉树是一个递归的结构,因此对它递归方式的遍历直观上很容易理解。
递归方式利用的是函数栈来保存数据,因此可以借助自己申请的数据栈实现非递归方式的遍历。
2. 非递归方式
借助数据栈。步骤:
当根节点非空时,申请一个数据栈,并把根节点压入栈中;
【从栈中弹出、保存栈顶节点,并打印该节点的值;
如果该节点的右孩子不为空,则将其压入栈中;
如果该节点的左孩子也不为空,则也将其压入栈中;】
然后重新判断栈是否为空,重复【】中的步骤,直至栈为空。
代码:
import java.util.Stack;
/*先序遍历,递归方式和非递归方式,打印二叉树节点的值
* 参数:根节点
* 输出:void
*/
public class PreOrder {
//先序遍历,递归方式
public static void preOrderRecursion(Node head){
if(head==null){
System.out.println("二叉树为空");
return;
}
System.out.print(head.val+", ");
if(head.left != null){
preOrderRecursion(head.left);
}
if(head.right != null){
preOrderRecursion(head.right);
}
}
---------------------------------------------
//先序遍历,非递归方式
public static void preOrder(Node head){
if(head == null){
System.out.println("二叉树为空");
return;
}
System.out.println("先序遍历,非递归方式");
Stack<Node> s = new Stack<Node>();
s.push(head);
while( !s.isEmpty() ){
head = s.pop();
System.out.print(head.val+", ");
if(head.right != null){
s.push(head.right);
}
if(head.left != null){
s.push(head.left);
}
}
}
--------------------测试-----------------------
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;
//递归方式,先序遍历二叉树
preOrderRecursion(head);
System.out.println();
System.out.println();
//非递归方式,先序遍历二叉树
preOrder(head);
}
}
本例创建了一个包含有7个节点的完全二叉树:
运行结果:
过程示意图: