二叉树的非递归遍历

二叉树的递归遍历方法形式很统一:

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;

            }

        }

    }

}

走在前人走过的路上,发现前人精妙的想法,敬佩,高兴。

原文地址:https://www.cnblogs.com/liujiahi/p/2196370.html