那么根据递归的性质还是很好判断的.下面是递归访问节点的顺序:
显然,递归访问时,每次出现该节点的第一次就为先序遍历,
第二次就为中序遍历,
第三次就为后序遍历
先序遍历:
//preorder Traversal
public static void preTraversal(Node head){
if(head==null){
return;
}
System.out.println(head.value);
preTraversal(head.left);
preTraversal(head.right);
}
中序遍历:
//inorder Traversal
public static void inTraversal(Node head){
if(head==null){
return;
}
inTraversal(head.left);
System.out.println(head.value);
inTraversal(head.right);
}
后序遍历:
//postorder Traversal
public static void postTraversal(Node head){
if(head==null){
return;
}
postTraversal(head.left);
postTraversal(head.right);
System.out.println(head.value);
}
非递归形式:
根据二叉树的访问可以知道:先中后访问顺序。
先序遍历的非递归形式为中左右. 因为栈出来的顺序与原来的顺序是相反的,起到了一个逆序的作用
设计流程就先压右子树的节点入栈在压左子树的节点入栈(弹出栈的时候就是左右)
//先序遍历
public static void preTraversal(Node head){
if(head!=null){
Stack<Node> stk=new Stack<Node>();
stk.push(head);
while(!stk.isEmpty()){
System.out.println(stk.pop().value);
if(head.right!=null){
stk.push(head.right);
}
if(head.left!=null){
stk.push(head.left);
}
}
}
}
//中序遍历
public static void inTraversal(Node head){
if(head!=null){
Stack<Node> stk=new Stack<Node>();
while(!stk.isEmpty() ||head!=null){
if(head!=null){
stk.push(head);
head=head.left;
}else{
head=stk.pop();
System.out.println(head.value);
head=head.right;
}
}
}
}
根据先序遍历的访问顺序可知:中左右,而后序遍历为左右中。那么其中的区别存在着逆序的关系(增加一个辅助栈).
其中的左右调整一下代码即可.
//后序遍历
public static void postTraversal(Node head){
if(head!=null){
Stack<Node> stk=new Stack<Node>();
Stack<Node> help=new Stack<Node>();
stk.push(head);
while(!stk.isEmpty()){
head=stk.pop();
help.push(head);
if(head.left!=null){
stk.push(head.right);
}
if(head.right!=null){
stk.push(head.right);
}
}
for(int i=0;i<help.size();i++){
System.out.println(help.pop().value);
}
}
}