算法6.6和6.7---有错误,未改正

来源:互联网 发布:什么是淘宝店铺sku 编辑:程序博客网 时间:2024/05/04 11:14
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define OK 1
#define OVERFLOW 0
#define Status int

typedef enum PointerTag {Link,Thread}PointerTag;
typedef struct BiThrNode{
  char data;
  struct BiThrNode *lchild,*rchild;
  PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;


Status InOrderThreading(BiThrTree,BiThrTree);
Status InThreading(BiThrTree,BiThrTree);
Status InOrderTraverse_Thr(BiThrTree);

int main(void){
  BiThrTree L,A,B,C,D,E,F,G,H,I,J,K;
  L=(BiThrTree)malloc(sizeof(BiThrNode));
  A=(BiThrTree)malloc(sizeof(BiThrNode));
  B=(BiThrTree)malloc(sizeof(BiThrNode));
  C=(BiThrTree)malloc(sizeof(BiThrNode));
  D=(BiThrTree)malloc(sizeof(BiThrNode));
  E=(BiThrTree)malloc(sizeof(BiThrNode));
  F=(BiThrTree)malloc(sizeof(BiThrNode));
  G=(BiThrTree)malloc(sizeof(BiThrNode));
  H=(BiThrTree)malloc(sizeof(BiThrNode));
  I=(BiThrTree)malloc(sizeof(BiThrNode));
  J=(BiThrTree)malloc(sizeof(BiThrNode));
  K=(BiThrTree)malloc(sizeof(BiThrNode));
 
  L->lchild=A;L->rchild=G;
  A->lchild=B;A->rchild=C;A->data='-';
  B->lchild=D;B->rchild=E;B->data='+';
  C->lchild=F;C->rchild=G;C->data='/';
  D->lchild=L;D->rchild=B;D->data='a';
  E->lchild=H;E->rchild=I;E->data='*';
  F->lchild=A;F->rchild=C;F->data='e';
  G->lchild=C;G->rchild=L;G->data='f';
  H->lchild=B;H->rchild=E;H->data='b';
  I->lchild=J;I->rchild=K;I->data='-';
  J->lchild=E;J->rchild=I;J->data='c';
  K->lchild=I;K->rchild=A;K->data='d';

  BiThrTree Thrt;
  InOrderThreading(Thrt,A);

  return 1;
}

Status InOrderTraverse_Thr(BiThrTree T){
  BiThrTree p;
  p=T->lchild;
  while(p!=T){
    while(p->LTag==Link) p=p->lchild;
    printf("%c",p->data);
    while(p->RTag==Thread && p->rchild!=T){
      p=p->rchild;
      printf("%c",p->data);
    }
    p=p->rchild;
    }
  printf("\n");
  return OK;
}

Status InOrderThreading(BiThrTree Thrt, BiThrTree T){
  BiThrTree pre;
  if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);

  Thrt->LTag=Link;Thrt->RTag=Thread;
  Thrt->rchild=Thrt;
  if(!T) Thrt->lchild=Thrt;
  else{
    Thrt->lchild=T;pre=Thrt;
    InThreading(T,pre);
    pre->rchild=Thrt;pre->RTag=Thread;
    Thrt->rchild=pre;
  }
  return OK;
}

Status InThreading(BiThrTree p,BiThrTree pre){
  if(p){
    InThreading(p->lchild,pre);
    if(!p->lchild){p->LTag=Thread;p->lchild=pre;}
    if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}
    pre=p;
    InThreading(p->rchild,pre);
  }
  return OK;
}


0 0