#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(" %d ",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,在使用整数常量的任意地方都可以使用枚举常量。
二.数据结构的定义
关于数据结构的定义,在学习了几个结构定义之后,我才明白,像二叉树这种在定义的内部又定义自己的定义是采用的递归的方式。