原来的博客地址:
http://blog.csdn.net/flying0033/article/details/6935393
那个博主的代码我当初直接复制运行结果不行。
后来自己改动了一下:
线索二叉树线索化的实质是遍历的过程修改空指针的过程:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef enum{Link,Thread} PointTag;
typedef char Element;
typedef int Status;
typedef struct Node{
Element data;
struct Node* left; //指向左孩子
struct Node* right; //指向右孩子
PointTag Ltag; //左右标志
PointTag Rtag;
}BitNode,*BitTree;
Status visit(Element e);
Status CreateTree(BitTree *T);
void InThreading(BitTree T);
void InOrderThreading(BitTree *H,BitTree T);
Status InOrderTraverse_Thr(BitTree L);
BitTree pre;
Status visit(Element e) //打印元素
{
printf("%c ",e);
return OK;
}
Status CreateTree(BitTree *T) //前序创建二叉树
{
Element ch;
scanf("%c",&ch);
if(ch == '#')
(*T) = NULL;
else
{
(*T) = (BitTree)malloc(sizeof(BitNode));
if(!(*T))
exit(OVERFLOW);
(*T)->data = ch;
CreateTree(&(*T)->left);
if((*T)->left) //初始化标志,有左孩子为Link
(*T)->Ltag = Link;
CreateTree(&(*T)->right);
if((*T)->right)
(*T)->Rtag = Link;
}
return OK;
}
void InThreading(BitTree p) //前序线索化二叉树
{
if(p)
{
if(!p->left)
{
p->left = pre;
p->Ltag = Thread;
}
if(!pre->right)
{
pre->right = p;
pre->Rtag = Thread;
}
pre = p;
if(p->Ltag == Link)
InThreading(p->left);
if(p->Rtag == Link)
InThreading(p->right);
}
}
void InOrderThreading(BitTree *H,BitTree T)
{
(*H) = (BitTree)malloc(sizeof(BitNode)); //建立头结点
if(!(*H))
exit(OVERFLOW);
(*H)->right = (*H); //右指针回指
(*H)->Rtag = Link;
if(!T)
{
(*H)->left = (*H);
(*H)->Ltag = Link; //二叉树为空,则左指针回指
}
else
{
pre = (*H);
(*H)->left = T;
(*H)->Ltag = Link;
InThreading(T); //前序遍历进行中序线索化
pre->right = (*H);
pre->Rtag = Thread;
(*H)->right = pre;
}
}
Status InOrderTraverse_Thr(BitTree L) //前序遍历线索化二叉树
{
BitTree p = L->left;
while(p != L)
{
visit(p->data);
if(p->Ltag == Link)
p = p->left;
else
p = p->right;
}
return OK;
}
int main()
{
BitTree H,T;
printf("请输入二叉树数据,空值以'#'代替,例如:('ABDH##I##EJ###CF##G##')\n");
CreateTree(&T);
InOrderThreading(&H,T);
printf("前序遍列序号为:\n");
InOrderTraverse_Thr(H);
return 0;
}