#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#define MaxSize 50
typedef int Elemtype;
//线索二叉树的定义
typedef struct ThreadNode
{
Elemtype data;
struct TreadNode *lchild,*rchild;
int ltag,rtag;
} ThreadNode,*ThreadTree;
ThreadTree pre; //开全局变量pre
ThreadTree CreateLink()
{
int data;
ThreadTree T;
scanf("%d",&data);
if(data==-1)return NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=data;
T->ltag=0,T->rtag=0;
printf("请输入%d的左子树: ",T->data);
T->lchild=CreateLink();
printf("请输入%d的右子树: ",T->data);
T->rchild=CreateLink();
return T;
}
}
//中序线索二叉树的构造
void InThread(ThreadTree p)
{
if(p!=NULL)
{
InThread(p->lchild);//递归,线索左子树
if(p->lchild==NULL) //递归到底时
{
p->lchild=pre;//lchild前驱为pre
p->ltag=1;//标记p有了前序线索
}
//有左孩子,不会有ltag,有有孩子不会有rtag
if(pre!=NULL&&pre->rchild==NULL) //更新pre的后继线索
{
pre->rchild=p;
pre->rtag=1;
}
pre=p;
InThread(p->rchild); //向右递归
}
}
void CreateInThread(ThreadTree T)
{
if(T!=NULL)
{
InThread(T);
pre->rchild=NULL; //最右侧结点,为最后遍历的一个结点,故需要将rchild复制NULL
pre->rtag=1;
}
}
//获取首结点
ThreadTree Firstnode(ThreadTree p)
{
while(p->ltag==0)p=p->lchild; //找到最左侧结点
return p;
}
//找出当前结点的后继结点
ThreadTree Nextnode(ThreadTree p)
{
if(p->rtag==0) return Firstnode(p->rchild); //有右孩子,需要找到右子树的最左侧结点
else return p->rchild;//存在右标记,则返回后继结点
}
void visit(ThreadTree p)
{
printf("%d ",p->data);
}
//中序线索二叉树的遍历
void InOrder(ThreadTree T)
{
for(ThreadTree p=Firstnode(T); p!=NULL; p=Nextnode(p))
visit(p);
}
int main()
{
ThreadTree T;
printf("请输入根节点数据: ");
T=CreateLink();// 1 2 -1 4 6 -1 -1 -1 3 -1 5 -1 -1
printf("输入完成\n");
CreateInThread(T);
printf("创建线索完成\n");
InOrder(T);// 2 6 4 1 3 5
return 0;
}
中序线索二叉树
最新推荐文章于 2023-05-10 17:42:59 发布