中序线索二叉树代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*******************************************************************************************************
Title:中序线索二叉树
Time:2016.06.23
Author:孙传奇,宋旭,高婷
Leader:孙传奇
*******************************************************************************************************/
#include
#include
#include
#define PRINT "%19c%12d%10c%10d%10c\n\n",p->lchild->data,p->LTag,p->data,p->RTag,p->rchild->data
#define LIST "\n\n lchild LTag data RTag rchild\n\n"
typedef enum{Link,Thread} PointerTag;//指针标志
typedef char DataType;
typedef struct BiThreTree{ //定义结点元素
PointerTag LTag,RTag;
DataType data;
struct BiThreTree *lchild,*rchild;
}BiThreTree;
BiThreTree *pre; //全局变量,用于二叉树的线索化
BiThreTree *CreateTree() //按先序输入建立二叉树
{
BiThreTree *T;
DataType e;
scanf("%c",&e);
if(e=='#')
T=NULL;
else
{T=(BiThreTree *)malloc(sizeof(BiThreTree));
T->data=e;
T->LTag=Link;//初始化时指针标志均为Link
T->RTag=Link;
T->lchild=CreateTree();
T->rchild=CreateTree();
}
return T;
}
void InThread(BiThreTree *T)//线索化
{
BiThreTree *p;
p=T;
if(p)
{
InThread(p->lchild);
if(!p->lchild)
{ p->LTag=Thread;
p->lchild=pre;
}
if(!pre->rchild)
{ pre->RTag=Thread;//1
pre->rchild=p;
}
pre=p;
InThread(p->rchild);
}
}
BiThreTree *InOrderThrTree(BiThreTree *T)//中序线索化二叉树
{
BiThreTree *Thre; //Th0re为头结点的指针
Thre=(BiThreTree *)malloc(sizeof(BiThreTree));
Thre->data='X';
Thre->lchild=T;
Thre->rchild=Thre;
pre=Thre;
InThread(T);
pre->RTag=Thread;
pre->rchild=Thre;
Thre->rchild=pre;
return Thre;
}
void InThrTravel(BiThreTree *Thre)//中序线索遍历二叉树
{
BiThreTree *p;
p=Thre->lchild;
while(p!=Thre)//指针回指向头结点时结束
{
while(p->LTag==Link)
p=p->lchild;
printf(PRINT);
while(p->RTag==Thread&&p->rchild!=Thre)
{
p=p->rchild;
printf(PRINT);
}
p=p->rchild;
}
}
BiThreTree *search_tree(BiThreTree *Thre,char tone)//中序线索遍历任一节点信息查询
{
BiThreTree *p;
p=Thre->lchild;
while(p!=Thre) //指针回指向头结点时结束
{
while(p->LTag==Link)
p=p->lchild;
if(p->data==tone)
return p;
while(p->RTag==Thread&&p->rchild!=Thre)
{
p=p->rchild;
if(p->data==tone)
return p;
}
p=p->rchild;
}
return p;
}
int main()
{
system("colo

r 17");
setences01:
for(int i=0;i<=78;i++)
printf("-");
printf("\n");
printf("| |\n");
printf("| 中 序 线 索 二 叉 树 |\n");
printf("| |\n");
for(int i=0;i<=78;i++)
printf("-");
printf("\n");
printf("| |\n");
printf("| 1.先序输入二叉树并线索化 |\n");
printf("| |\n");
printf("| 2.线索化输出结点信息 |\n");
printf("| |\n");
printf("| 3.输出任一结点的信息 |\n");
printf("| |\n");
printf("| 4.退出 |\n");
printf("| |\n");
for(int i=0;i<=78;i++)
printf("-");
printf("\n\n请选择对应操作: ");
int n;
char tone;
setences02:
scanf("%d",&n);
switch(n)
{
case 1:
getchar();
printf("\n请先序输入二叉树结点数据('#'表示空): \n");
BiThreTree *T,*Thre;
T=CreateTree();
Thre=InOrderThrTree(T);
printf("\n回车键返回主界面");
getchar();
getchar();
system("cls");
goto setences01;
break;
case 2:
system("cls");
printf("\n各结点的信息为:\n\n");
for(int i=0;i<=78;i++)
printf("-");
printf(LIST);
InThrTravel(Thre);
for(int i=0;i<=78;i++)
printf("-");
printf("\n");
printf("\n回车键返回主界面");
getchar();
getchar();
system("cls");
goto setences01;
break;
case 3:
BiThreTree *p;
system("cls");
printf("\n请输入您要查找的结点: ");
getchar();
scanf("%c",&tone);
p=search_tree(Thre,tone);
if(p==Thre) printf("\n\n没有此结点!\n");
else
{
printf("\n此结点的线索化信息为:\n");
for(int i=0;i<=78;i++)
printf("-");
printf(LIST);
printf(PRINT);
for(int i=0;i<=78;i++)
printf("-");
}
printf("\n\n回车键返回主界面");
getchar();
getchar();
system("cls");
goto setences01;
break;
case 4:
return 0;
default:
printf("输入错误,请重新输入:\n");
goto setences02;
}
return 0;
}

相关文档
最新文档