文档介绍:如何用栈实现递归与非递归的转换(一)三种遍历树的算法    递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。?    1)并不是每一门语言都支持递归的.    2)有助于理解递归的本质.    3)有助于理解栈,    递归与非递归的转换基于以下的原理:,这个"原理"并没有经过严格的数学证明,只是我的一个猜想,,有三种方法可以遍历树:前序,中序,,,这里以特殊的二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的遍历,其它的树遍历方式就不难了。1)前序遍历a)递归方式:voidpreorder_recursive(BitreeT)     /*先序遍历二叉树的递归算法*/{if(T){visit(T);//访问当前结点preorder_recursive(T->lchild);  /*访问左子树*/                          preorder_recursive(T->rchild);  /*访问右子树*/                       }                    }        b)非递归方式              voidpreorder_nonrecursive(BitreeT)     /*先序遍历二叉树的非递归算法*/                    {                       initstack(S);                       push(S,T);            /*根指针进栈*/                       while(!stackempty(S)){                          while(gettop(S,p)&&p){     /*向左走到尽头*/                             visit(p);     /*每向前走一步都访问当前结点*/                             push(S,p->lchild);                          }                          pop(S,p);                          if(!stackempty(S)){     /*向右走一步*/                             pop(S,p);                             push(S,p->rchild);                          }                       }                    }        2)中序遍历        a)递归方式              voidinorder_recursive(BitreeT)     /*中序遍历二叉树的递归算法*/                    {                       if(T){                          inorder_recursive(T->lchild);  /*访问左子树*/                          visit(T);         /*访问当前结点*/                          inorder_recursive(T->rchild);  /*访问右子树*/                       }                    }        b)非递归方式              void inorder_nonrecursive(BitreeT)                    {                       initstack(S);           /*初始化栈*/                       push(S,T);           /*根指针入栈*/                       while(!stackempty(S)){                          while(gett