结构推理 编程实现线索二叉树的定义的构造算法和中根遍历算法。
【正确答案】/*线索二叉树的定义的构造算法和中根遍历算法*/
   #include<stdio.h>
       #include<stdlib.h>
       typedefint DataType;
       struct ThrTreeNode;    /*穿线树中的结点*/
   typedefstruct ThrTreeNode*PThrTreeNode;  /*指向穿线树结点的指针类型*/
       struct ThrTreeNode {    /*穿线树中每个结点的结构*/
         DataType    info;
         PThrTreeNode llink,  rlink;
         int ltag,  rtag;
       };
      typedefstruct ThrTreeNode *ThrTree;/*穿线树类型的定义*/
      typedefThrTree *PThrTree;    /*穿线树类型的指针类型*/
      #define MAXNUM 100    /*栈中最大元素个数*/
      struct SeqStack{    /*顺序栈类型定义*/
          int    t;
          PThrTreeNode s[MAXNUM];
      };
      typedef struct SeqStack *PSeqStack;  /*栈类型的指针类型*/
      /*创建一个空栈;为栈结构申请空间,并将栈顶变量赋值为-1*/
       PSeqStack createEmptyStack_seq(void){
       PSeqStack pastack;
       pastack=(PSeqStack)malloc(sizeof(struct SeqStack));
       if(pastack==NULL)
         printf("Out ofspace!!\n");
       else
         pastack->t=-1;
       retum pastack;
     }
   /*判断pastack所指的栈是否为空栈,当pastack所指的栈为空栈时,则返回1,否则返回0*/
   int isEmptyStack_seq(PSeqStack pastack){
       retum pastack->t==-1;
   }
   /*在栈中压入一元素x*/
   void push_seq(PSeqStack pastack,PThrTreeNode x){
       if(pastaek->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所指的栈不为空栈时,求栈顶元素的值*/
   PThrTreeNode top_seq(PSeqStack pastack){
       return pastack->s[pastack->t];
   }
   void thread(PThrTree t){
       PSeqStack st;
       PThrTreeNode p;    /*指向当前正在访问的结点*/
       PThrTreeNode pr;    /*指向P的对称序的前驱结点*/
       if(t=NULL||*t=NULL)return;
       st=createEmptyStack_seq ();    /*创建空栈*/
       p=*t;
       pr=NULL;
       do {
      while(p!=NULL){  /*遇到结点推入栈中,然后处理其左子树*/
         push_seq(st,p);
         p=p->llink;
       }
   /*左子树处理完,从栈顶托出结点并访问*/
   while(p==NULL&&!isEmptyStack_seq(st)){
       p=top_seq(st);
       pop_seq(st);
       if(pr!=NULL){
       if(pr->rlink==NULL)   {/*检查前驱结点的右指针*/
           pr->rlink=p;
       pr->rtag=1;
           }
       if(p->llink==NULL){/*检查该结点的左指针*/
           p->llink=pr;
           p->1tag=l;
           }
         }
       pr=p;
       p=p->rlink;    /*处理右子树*/
      }
     }while(!isEmptyStack_seq(st)|| p!=NULL);
    free(st);    /*释放栈空间*/
   }
   void visit(PThrTreeNode p){printf("/%d",p->info);  }
   /*按对称序周游对称序穿线树*/
   void nlnOrder(PThrTree t){
       PThrTreeNode p;
       if(t==NULL*t==NULL)return;
       p=*t;
   while(p->llink!=NULL&&p->ltag==0)    /*顺左子树一直向下*/
           p=p->llink;
       while(p!=NULL){
           visit(p);
     if(p->rlink!=NULL&&p->rtag==0){  /*右子树不是线索时*/
         p=p->rlink;
   while(p->llink !=NULL&&p->ltag==0)/*顺右子树的左子树一直向下*/
               p=p->llink;
         }
       else
           p=p->rlink;    /*顺线索向下*/
         }
     }
     int main()
     {
       return 0;
   }
【答案解析】