菜鸡学习记录,贴代码:创建线索二叉树并中序遍历线索二叉树,前序后序这两天补上。
/**
* 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;
}