栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

线索二叉树(C语言实现)——先序线索链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线索二叉树(C语言实现)——先序线索链表

#include
#include
#include
typedef char DataType;

//	标志域利用枚举常量来实现 
typedef enum
{
	link,		//	link(0)—指针
	Thread		//	Thread(1)—线索 
}flag;

typedef struct TNode
{
	DataType data;			//	数据域 
	struct TNode * lchild;	//	左指针域 
	struct TNode * rchild;	//	右指针域 
	flag ltag,rtag;			//	flag == 0——指向左、右孩子,flag == 1——指向前驱、后继结点
	
}ThreadTNode,*ThreadBiTree;

void Creat_BiTree(ThreadBiTree * T);						// 建立二叉树 
void Creat_PreThreadBiTree(ThreadBiTree * T);				// 建立先序线索二叉树 
void PreThread_BiTree(ThreadBiTree * T, ThreadBiTree * pre);// 先序遍历线索化二叉树 
ThreadBiTree Get_Next(ThreadBiTree T);						// 获取先序线索二叉树的后继结点 
void PreTraverse_ThreadBiTree(ThreadBiTree T);				// 先序遍历线索二叉树 
bool Destroy_PreThreadBiTree(ThreadBiTree T);				// 销毁线索二叉树 


int main()
{
	ThreadBiTree T;
	printf("请输入根结点:");
	Creat_BiTree(&T);
	Creat_PreThreadBiTree(&T);
	printf("n");
	printf("先序遍历输出线索二叉树:");
	PreTraverse_ThreadBiTree(T);
	printf("n");
	if(Destroy_PreThreadBiTree(T))
		printf("销毁成功!n");
	else
		printf("销毁失败!n");

	return 0;
}

void Creat_BiTree(ThreadBiTree * T)
{
	char ch;
	fflush(stdin);
	scanf("%c",&ch);
	if(ch == '#')
	{
		*T = NULL;
		return;
	}
	else
	{
		*T = (ThreadBiTree)malloc(sizeof(ThreadTNode));
		(*T)->data = ch;
		printf("请输入%c的左孩子:",ch);
		Creat_BiTree(&(*T)->lchild);
		printf("请输入%c的右孩子:",ch);
		Creat_BiTree(&(*T)->rchild);
	}
}

void Creat_PreThreadBiTree(ThreadBiTree * T)
{
	ThreadBiTree pre = NULL;
	
	if(!(*T))
		return;
	else
	{
		PreThread_BiTree(T, &pre);
		pre->rtag = 1;
		pre->rchild = NULL;
		return;
	}	 
} 

void PreThread_BiTree(ThreadBiTree * T, ThreadBiTree * pre)
{
	if(!(*T))
		return;
	
	if((*T)->lchild == NULL)
	{
		(*T)->ltag = Thread;
		(*T)->lchild = *pre;
	}
	if((*pre) != NULL && (*pre)->rchild == NULL )	//	注意这两玩意的顺序哈 
	{
		(*pre)->rtag = Thread;
		(*pre)->rchild = *T;
	}	
	*pre = *T;							 //	更新指向前趋结点的指针 
	if((*T)->ltag == link)
	PreThread_BiTree(&(*T)->lchild, pre);//	递归线索化左子树 
	
	PreThread_BiTree(&(*T)->rchild, pre);//	递归线索化右子树 
}

ThreadBiTree Get_Next(ThreadBiTree T)	//	寻找下一个结点 
{
	if(!T)
		return NULL;
	else
	{
		if(T->rtag == Thread || T->ltag == Thread)
			return T->rchild;
		else
			return T->lchild;
		
		
		
	}
}

void PreTraverse_ThreadBiTree(ThreadBiTree T)
{	
	ThreadBiTree p = T;			//	获取先序线索二叉树的第一个结点 
	while(p)
	{
		printf("%3c",p->data);	//	先序遍历输出前序线索二叉树 
		p = Get_Next(p); 
	} 
	
	return;
}

bool Destroy_PreThreadBiTree(ThreadBiTree T)
{
	ThreadBiTree p = T;
	while(p)
	{
		ThreadBiTree q = Get_Next(p);
		free(p);
		p = q;
	}
	
	T = p = NULL;
	return true;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号