对于二叉树,我们自然非常熟悉它的三种递归遍历方式,但是许多朋友对三种遍历方式的非递归代码却并不熟悉,事实上这三种非递归遍历方式还是很有用的,特别是非递归的后序遍历,具有如下特点:
若遍历至节点A时,该栈中的元素即为A节点的所有祖先节点,即只需要将该栈打印出来,就可以得到从根节点至A节点的一个路径。
public class TravelSal {
/**
* 非递归形式的前序遍历
*/
public static void preOrder(BTNode BTNode){
BTNode[] st=new BTNode[255];
BTNode p=BTNode;
int k=0;
if(BTNode!=null){
st[k++]=p;
while(k>0){
p=st[--k];
System.out.print(p.getData()+" ");
if(p.getRight()!=null){
st[k++]=p.getRight();
}
if(p.getLeft()!=null){
st[k++]=p.getLeft();
}
}
}
}
/**
* 非递归形式的中序遍历
*/
public static void inOrder(BTNode BTNode){
BTNode[] st=new BTNode[255];
BTNode p;
int k=0;
if(BTNode!=null){
p=BTNode;
while(k>0||p!=null){
while(p!=null){
st[k++]=p;
p=p.getLeft();
}
if(k>0){
p=st[--k];
System.out.print(p.getData()+" ");
p=p.getRight();
}
}
}
}
/**
* 非递归的后序遍历
* @param BTNode
*/
public static void postOrder(BTNode BTNode){
BTNode[] st=new BTNode[255];
BTNode p=BTNode;
BTNode pre;
int k=0;
int flag=0;
if(p!=null){
st[k++]=p;
p=p.getLeft();
while(k>0){
while(p!=null){
st[k++]=p;
p=p.getLeft();
}
pre=null; //在将所有左子结点入栈后需将pre重置为null
flag=1; //flag=1表示当前节点的左子结点已经全部入栈了
while(k>0&&flag==1){
p=st[k-1];
if(pre==p.getRight()){
k--;
System.out.print(p.getData()+" ");
pre=p;
}
else{
p=p.getRight();
flag=0;
}
}
}
}
}
public static void main(String args[]){
int[] a={-1,2,4,6,7,-1,-1,-1};
BTNode node=BinaryTreeFactory.buildTreeByArray(a, 7);
BinaryTreeFactory.inOrder(node);;
inOrder(node);
}
}
这里的二叉树用的是前一篇文章中的模型类,不清楚的朋友可以再去看一下,为了测试方便就全部写成静态方法了