线索二叉树创建及中序遍历(待完善)

来源:互联网 发布:网络剧大话三国 编辑:程序博客网 时间:2024/06/15 15:58



菜鸡学习记录,贴代码:创建线索二叉树并中序遍历线索二叉树,前序后序这两天补上。



/***   dandelion**   线索二叉树(中序,其余待补充)**   2017-08-13**/#include<stdio.h>#include<stdlib.h>typedef char ElemType;typedef enum{Link,Thread} PointTag;typedef struct BinaryNode{    ElemType data;    struct BinaryNode *lchild,*rchild;    PointTag leftTag,rightTag;}BinaryNode;typedef struct BinaryNode *Bitree;int i=0;Bitree pre;/**初始化树*/void InitTree(Bitree *T){    *T=(Bitree)malloc(sizeof(BinaryNode));    if(!T)        exit(0);    (*T)->lchild=NULL;    (*T)->rchild=NULL;}/**前序创建树*/void FirstCreate(Bitree *T,char *str){    char data = str[i];    i++;    if('#'==data)        *T=NULL;    else    {        *T = (BinaryNode*)malloc(sizeof(BinaryNode));        (*T)->data = data;        (*T)->leftTag=Link;        (*T)->rightTag=Link;        FirstCreate(&(*T)->lchild,str);        FirstCreate(&(*T)->rchild,str);    }}/**头结点处理*/void CreateHeadNode(Bitree *head,Bitree T){    *head = (Bitree)malloc(sizeof(BinaryNode));    (*head)->leftTag=Link;    (*head)->rightTag=Thread;    (*head)->rchild=*head;    if(T)    {        (*head)->lchild=T;        pre=*head;        MidThreading(T);        pre->rchild = *head;        pre->rightTag = Thread;        (*head)->rchild = pre;    }    else        (*head)->lchild=*head;}/**中序遍历线索化*/void MidThreading(Bitree T){    if(T)    {        //printf("T:%c   pre:%c\n",T->data,pre->data);        MidThreading(T->lchild);        if(!T->lchild)        {            T->leftTag=Thread;            T->lchild=pre;        }        if(!pre->rchild)        {            pre->rightTag=Thread;            pre->rchild=T;        }        pre = T;        //printf("T:%c   pre:%c\n",T->data,pre->data);        MidThreading(T->rchild);    }}/**中序遍历线索二叉树(非递归)*/void midTravaling(Bitree T){    Bitree temp;    temp=T->lchild;    while(temp!=T)    {        while(temp->leftTag==Link)            temp=temp->lchild;        printf("%c",temp->data);        while(temp->rightTag==Thread && temp->rchild!=T)        {            temp=temp->rchild;            printf("%c",temp->data);        }        temp = temp->rchild;    }}int main(){    Bitree t,T;    char str[30];    scanf("%s",str);    InitTree(&T);    FirstCreate(&T,str);    CreateHeadNode(&t,T);    printf("result:\n");    midTravaling(t);    return 0;}