实现操作:
void CreatTree(TreeNode **T,char *data,int *index); //创建二叉树
void CreatTree_Thread_In(TreeNode *T,TreeNode **pre); //创建中序线索二叉树
TreeNode *GetFirst(TreeNode *T); //找到第一个结点
TreeNode *GetNext(TreeNode *node); //找到下一结点
定义结构体:
typedef struct TreeNode
{
char val;
int ltag; //ltag == 0 表示指向左子树,ltag == 1表示指向前驱结点
int rtag; //rtag == 0 表示指向右子树,rtag == 1表示指向后继结点
struct TreeNode *lchild;
struct TreeNode *rchild;
}TreeNode;
程序:
void main()
{
TreeNode *tree;
TreeNode *pre = NULL;
int index = 0;
char *data = "ABD##E##CF##G##";
CreatTree(&tree,data,&index);
CreatTree_Thread_In(tree,&pre);
pre->rtag = 1;
pre->rchild = NULL;
for(TreeNode *node = GetFirst(tree);node != NULL;node = GetNext(node))
{
printf("%c\t",node->val);
}
printf("\n");
system("pause");
return ;
}
void CreatTree(TreeNode **T,char *data,int *index)
{
char ch;
ch = data[*index];
*index += 1;
if(ch == '#')
{
//此时为空结点
*T = NULL;
}
else
{
//非空结点
*T = (TreeNode *)malloc(sizeof(TreeNode));
(*T)->val = ch;
(*T)->rtag = 0;
(*T)->ltag = 0;
//创建左子树
CreatTree(&((*T)->lchild),data,index);
//创建右子树
CreatTree(&((*T)->rchild),data,index);
}
}
void CreatTree_Thread_In(TreeNode *T,TreeNode **pre)
{
//如果结点为空则结束
if(T == NULL)
return ;
CreatTree_Thread_In(T->lchild,pre);
if(T->lchild == NULL)
{
T->ltag = 1;
T->lchild = *pre;
}
if((*pre) != NULL && (*pre)->rchild == NULL)
{
(*pre)->rtag = 1;
(*pre)->rchild = T;
}
*pre = T;
CreatTree_Thread_In(T->rchild,pre);
}
TreeNode *GetFirst(TreeNode *T)
{
while(T->ltag == 0)
{
T = T->lchild;
}
return T;
}
TreeNode *GetNext(TreeNode *node)
{
if(node->rtag == 1)
return node->rchild;
else
return GetFirst(node->rchild);
}
测试结果:
分析:
声明: 此文章为学习笔记,如有侵权请联系删除。