结构推理 编程实现二叉树后根遍历的非递归算法。
【正确答案】/*二叉树后根遍历的非递归算法*/
   #include<stdlib.h>
   #include<stdio.h>
   typedefchar DataType;
   struct BinTreeNode;    /*二叉树中结点*/
   typedef struct BinTreeNode *PBinTreeNode;  /*结点的指针类型*/
     struct BinTreeNode
     {
       DataType info;    /*数据域*/
       PBinTreeNode Ilink:    /*指向左子女*/
       PBinTreeNode rlink;    /*指向右子女*/
     };
   typedef struct BinTreeNode *BinTree;
   typedef BinTree *PBinTree;
   typedefPBinTreeNode BNode;
   PBinTreeNode root btree(PBinTree t)
   {
       return *t;
   }
   PBinTreeNode leffChild_btree(PBinTreeNode p)
   {
       return p->llink;
   }
   PBinTreeNode rightChild_btree(PBinTreeNode p)
   {
       return p->rlink;
   }
   /*以下算法就是先将二叉树扩充为扩充的二叉树,然后按先根次序周游的顺序输入结点的信息,生成一个双链存储的二叉树的过程*/
   PBinTreeNode createRest BTree()
   {
   /*递归创建从根开始的二叉树*/
       PBinTreeNode pbnode;
       char ch;
       scanf("/%c",&ch);
       if(ch=='@')pbnode=NULL;
     else{
       pbnode=(PBinTreeNode)malloc(sizeof(struct BinTreeNode));
       if(pbnode==NULL){
           printf("Out of space!\n");
           return pbnode;
       }
     pbnode->info=ch;
     pbnode->llink=createRest_BTree();  /*构造左子树*/
     pbnode->rlink=createRest_BTree();  /*构造右子树*/
     }
    return pbnode;
   }
   PBinTree create_BTree(void)f
     /*创建完整的二叉树*/
       PBinTree pbtree=(PBinTree)malloc(sizeof(BinTree));
       if(pbtree !=NULL)
         *pbtree=createRest_BTree();/*递归创建从根开始的二叉树*/
       return pbtree;
   }
   void visit(BNode p){printf("/%c",p->info); }
   typedef struct{
       BNode ptr;    /*进栈结点*/
       int tag;    /*标记*/
     }Elem;
   /*栈顺序表示*/
   #define MAXNUM 20    /*栈中最大元素个数*/
   struct SeqStack{    /*顺序栈类型定义*/
       int t;    /*指示栈顶位置*/
       Elem s[MAXNUM];
     };
   typedefstruct SeqStack*PSeqStack;    /*顺序栈类型的指针类型*/
   /*创建一个空栈;为栈结构申请空间,并将栈顶变量赋值为-1*/
   PSeqStack createEmptyStack seq(void){
       PSeqStack pastack;
       pastack=(PSeqStack)malloc(sizeof(struct SeqStack));
       if(pastack==NULL)
           printf("Out of space!!\n");
       else
           pastack->t=-1;
       retum pastack;
   }
   /*判断pastack所指的栈是否为空,为空栈时返回1,否则返回0*/
     int isEmptyStack_seq(PSeqStack pastack){
       return pastack->t-1;
   }
   /*在栈中压入一元素x*/
   void ptlsh_seq(PSeqStack pastack,Elem x){
       if(pastack->t>=MAXNUM-1)
           printf("Overflow!\n");
       else{
           pastack->t++;
           pastack->s[pastack->t]=x;
         }
     }
   /*删除栈顶元素*/
   void pop_seq(PSeqStack pastack){
       if(pastack->t==-1)
           printf("Underflow!\n");
       else
           pastack->t--;
   }
   /*假定pastack所指的栈不为空,求栈顶元素的值*/
   Elem top_seq(PSeqStack pastack){
       return(pastaek->s[pastack->t]);
   }
   void nPostOrder(PBinTree t){
       PSeqStack st;    /*栈中元素类型为Elem*/
       Elem stnode;
       BNode p;    /*周游时当前要处理的结点*/
   char continueflag;    /*表明是否继续退栈,从右子树返回时访问完根之后需继续退栈*/
       if(*t==NULL)return;
       st=createEmptyStack_seq();    /*创建空栈*/
       p=*t;    /*从根结点开始*/
       do {  /*每执行一次大循环进入一棵由p指出根的子树去周游*/
   while(p!=NULL){  /*反复地把遇到的结点进栈并进入它的左子树*/
       stnode.ptr=p;
       stnode.tag=1;
       push_seq(st,stnode);
       p=leftChild_btree(p);
     }
     continueflag='t';
     while(continueflag=='t'&&!isEmptyStack_seq(st)){
       stnode=top_seq(st);
       pop_seq(st);    /*退栈*/
       p=stnode.ptr;
       if(stnode.tag==1){
   /*如果是从左子树回来,则改标志重新进栈,停止退栈并进入右子树*/
       stnode.tag=2;
       push_seq(st,  stnode);
       continueflag='f';
       p=rightChild_btree(p);
      }
      else visit(p);
     }
    }while(!isEmptyStack_seq(st));/*栈为空时,全部周游完*/
   }
   intmain()
   {
       PBinTree tree=create_BTree();
       nPostOrder(tree);
       putchar("\n');
       return 0;
     }
【答案解析】