树—线索二叉树的创建&二叉树的后序遍历&中序线索化&中序遍历线索二叉树

#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW 0
typedef char TElemType;
typedef enum {Link,Thread}PointerTag;
typedef struct BiThrNode
{
    TElemType data;
    struct BiThrNode *lchild,*rchild;
    PointerTag LTag;
    PointerTag RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre;
void CreateBiThrTree(BiThrTree *T);
void PostOrderTravese(BiThrTree T);
void InThreading(BiThrTree p);
int InOrderThreading(BiThrTree *Thrt,BiThrTree T);
void InOrderTraverse_Thr(BiThrTree T);
int main()
{
    BiThrTree T;
    BiThrTree t;
    CreateBiThrTree(&T);
    PostOrderTravese(T);
    printf("\n%d\n",InOrderThreading(&t,T));//只需要t是指针,因为t起着头结点的作用,连接上T后就成了新的有头结点的二叉树结构。
    InOrderTraverse_Thr(t);
    return 0;
}

void CreateBiThrTree(BiThrTree *T)//前序遍历序列:AB#D##C##
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch=='#')
    {
        *T=NULL;
    }
    else
    {
        *T=(BiThrTree)malloc(sizeof(BiThrNode));
        if(!*T)
            exit(OVERFLOW);
        (*T)->data=ch; /* 生成根结点(前序) */
        CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */
        if((*T)->lchild) /* 有左孩子 */
            (*T)->LTag=Link;
        CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */
        if((*T)->rchild) /* 有右孩子 */
            (*T)->RTag=Link;
    }
}
void PostOrderTravese(BiThrTree T)
{
    if(T==NULL)
        return;
    PostOrderTravese(T->lchild);
    PostOrderTravese(T->rchild);
    printf("%c",T->data);
}

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);

    }
}
int InOrderThreading(BiThrTree *Thrt,BiThrTree T)//形参是指针原来的变量要变,非指针原来的变量不变。
{
    *Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
    if(!*Thrt)
        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->rchild=*Thrt;
        pre->RTag=Thread;
        (*Thrt)->rchild=pre;
    }
    return 1;
}
void 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;
    }
}

  一.C语言知识复习:

线索二叉树用到了枚举类型,其语法和结构的语法差不多,下面复习了一下我不是很熟练的知识点。

enumerated type

目的:提高程序的可读性。

②定义(以上面所写的为例):

enum {Link,Thread}PointerTag;
PointerTag LTag;
1,声明结构的过程和定义结构变量的过程可以被合并成一步,如上所示。
2,枚举常量可以限定为任意一种整数类型(如unsigned char)。
3,在使用整数常量的任意地方都可以使用枚举常量。

二.数据结构的定义
关于数据结构的定义,在学习了几个结构定义之后,我才明白,像二叉树这种在定义的内部又定义自己的定义是采用的递归的方式。


 

posted @ 2017-02-07 16:29  路人姜。  阅读(479)  评论(0编辑  收藏  举报