二叉树的递归遍历方法形式很统一:
void Traverse(BiTree T){
if(T){
//visit,先序遍历
Traverse(T->lchild);
//visit,中序遍历
Traverse(T->rchild);
//visit,后序遍历
}
}
可是非递归遍历呢?前序和中序还好,跟递归的形式差不多:
void InOrderTraverse(BiTree T, status(* visit)(TElemType e)){
InitStack(s); p=T;
while(p || !StackEmpty(s)){
if(p){
//visit,先序遍历
Push(s,p); p=p->lchild;
}else{
Pop(s,p);
//visit,中序遍历
p=p->rchild;
}
}
}
当然前序遍历有一种优化,就是push的时候压入右孩子,然后else中直接换成Pop (s, p),节省一句代码的事,大同小异。
然而后序呢?却无法套用上面的形式,该怎么办呢?这个的确让我想了很久,查了很多资料,都嫌繁琐和与前面形式不统一。
最后找到了这篇博文:http://dimcutter.blog.163.com/blog/static/930932962010437590311/ 豁然开朗。
非递归遍历二叉树的统一形式应当是这样的:
status Traverse(BiTree T, status(* visit)(TElemType e)){
IniTStack(s); p=T; p1=NULL;
while(p || !StackEmpty(s)){
if(p){
Push(s,p);
//visit,先序
p=p->lchild;
}else{
GetTop(s,p);
//visit,中序
if(p->rchild==p1){
Pop(s,p1);p=NULL;
//visit,后序
}else{
p=p->rchild;p1=NULL;
}
}
}
}
走在前人走过的路上,发现前人精妙的想法,敬佩,高兴。