欢迎使用CSDN-markdown编辑器

来源:互联网 发布:淘宝的天天特价在哪里 编辑:程序博客网 时间:2024/04/28 23:27
#include<stdio.h>//线索二叉树#include<stdlib.h>#include<malloc.h>#define OK 1#define OVERFLOW -1#define ERROR 0typedef int Status;typedef char TElemType;typedef enum PointerTag{Link,Thread};typedef struct BiThrNode{    TElemType data;    struct BiThrNode *lchild,*rchild;    PointerTag LTag,Rtag;}BiThrNode,*BiThrTree;BiThrTree pre;Status PrintElement(TElemType e){    printf("%c",e);    return OK;}/*Status PreOrderTraverse(BiThrTree T,Status (*Visit)(TElemType e)){    if(T){        if(Visit(T->data))            if(PreOrderTraverse(T->lchild,Visit))                if(PreOrderTraverse(T->rchild,Visit))                    return OK;        return ERROR;    }else return OK;}*/Status CreateBiTree(BiThrTree &T){    TElemType ch;    scanf("%c",&ch);    if(ch=='#') T=NULL;    else{        if(!(T=(BiThrNode*)malloc(sizeof(BiThrNode))))            exit(OVERFLOW);        T->data=ch;        T->LTag=Link;        CreateBiTree(T->lchild);        CreateBiTree(T->rchild);    }    return OK;}void InThreading(BiThrTree p){    if(p){        InThreading(p->lchild);        if(!p->lchild){            p->LTag=Thread;            p->lchild=pre;        }        if(!pre->rchild){            pre->Rtag=Thread;            pre->rchild=p;        }        pre=p;        InThreading(p->rchild);    }}Status InOrderThreading(BiThrTree &Thrt,BiThrTree T){    if(!(Thrt=(BiThrNode*)malloc(sizeof(BiThrNode))))        exit(OVERFLOW);    Thrt->LTag=Link;    Thrt->rchild=Thrt;    if(!T) Thrt->lchild=Thrt;    else{        Thrt->lchild=T;        pre=Thrt;        InThreading(T);        pre->rchild=Thrt;        pre->Rtag=Thread;        Thrt->rchild=pre;    }}Status InOrderTraverse_Thr(BiThrTree T,Status (*Visit)(TElemType e)){    BiThrTree p;    p=T->lchild;    while(p!=T){        while(p->LTag==Link) p=p->lchild;        if(!Visit(p->data)) return ERROR;        while(p->Rtag==Thread&&p->rchild!=T){            p=p->rchild;            Visit(p->data);        }        p=p->rchild;    }    return OK;}int main(){    BiThrTree T;    CreateBiTree(T);    //pre=T;    //PreOrderTraverse(T,PrintElement);    BiThrTree Thrt;    InOrderThreading(Thrt,T);    InOrderTraverse_Thr(Thrt,PrintElement);    return 0;}
原创粉丝点击