#includeusing namespace std; #define Status int #define OK 1 #define ERROR 0 #define TElemType char typedef enum{ link,Thread }PointerTag; typedef struct BiThrNode{ TElemType data; struct BiThrNode *lchild, *rchild; PointerTag LTag , RTag; }BiThrNode, *BiThrTree; char Vexch[26]={'A','B','D','H','$','$','I','$','$','E','J','$','$','$','C','F','$','$','G','$','$'}; int i=0; Status CreatBiThrTree(BiThrTree &T) { if(Vexch[i++]=='$') T=NULL; else { T= (BiThrTree)malloc(sizeof(BiThrNode)); if(!T) return 0; T->data=Vexch[i-1]; T->LTag=link; CreatBiThrTree(T->lchild); T->RTag=link; CreatBiThrTree(T->rchild); } return 1; } Status visit(TElemType e) { cout << e << " "; return OK; } BiThrTree pre; void PreThreading(BiThrTree p) { if(p) { if(!p->lchild) { p->LTag = Thread; p->lchild = pre; } if(!pre->rchild) { pre->RTag = Thread; pre->rchild = p ; } pre = p; if(p->LTag == link) PreThreading(p->lchild); if(p->RTag == link) PreThreading(p->rchild); } } Status PreOrderThreading(BiThrTree &Thrt,BiThrTree T) { if(!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) return ERROR; Thrt->RTag = Thread; Thrt->rchild = Thrt ; Thrt->LTag = link; if(!T) { Thrt->lchild = Thrt; } else { Thrt->lchild = T; pre = Thrt ; PreThreading(T); pre->rchild = Thrt ; pre->RTag = Thread; Thrt->rchild = pre; } return OK; } Status PreOrderTraverse_Thr(BiThrTree T) { BiThrTree p ; p = T->lchild; while(p != T) { visit(p->data); if(p->LTag == link) p = p->lchild; else p = p->rchild; } return OK; } int main() { BiThrTree T, PreT; CreatBiThrTree(T); PreOrderThreading(PreT , T); PreOrderTraverse_Thr(PreT); cout << endl; return 0; }



