栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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;		//	右孩子指针域 
	struct TNode * parent;		//	双亲指针域 
	flag ltag,rtag;				//	flag==0 —指向左、右孩子,flag==1 —指向前驱、后继结点
	
}ThreadTNode,*ThreadBiTree;

void Creat_BiTree(ThreadBiTree * T);						//	建立二叉树 
void Creat_PostThreadBiTree(ThreadBiTree * T);				//	建立后序线索二叉树 
void PostThread_BiTree(ThreadBiTree * T, ThreadBiTree * pre);//	后序线索化二叉树 
ThreadBiTree Get_First(ThreadBiTree T);						//	获取线索二叉树中的第一个结点
ThreadBiTree Get_Next(ThreadBiTree T);						//	获取线索二叉树的后继结点 
void PostTraverse_ThreadBiTree(ThreadBiTree T);				//	后序遍历线索二叉树 
bool Destroy_PostThreadBiTree(ThreadBiTree T);				//	销毁线索二叉树 


int main()
{
	ThreadBiTree T;
	printf("请输入根结点:");
	Creat_BiTree(&T);
	Creat_PostThreadBiTree(&T);
	printf("n");
	printf("后序遍历输出线索二叉树:");
	PostTraverse_ThreadBiTree(T);
	printf("n");
	if(Destroy_PostThreadBiTree(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);
		if((*T)->lchild)
			(*T)->lchild->parent = *T;
		if((*T)->rchild)
			(*T)->rchild->parent = *T;
	}
}

void Creat_PostThreadBiTree(ThreadBiTree * T)
{
	ThreadBiTree pre = NULL;
	
	if(!(*T))
		return;
	else
	{
		PostThread_BiTree(T, &pre);
		return;
	}	 
} 

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

ThreadBiTree Get_First(ThreadBiTree T)
{
	while(T->ltag == link)
		T = T->lchild;
		
	if(T->rtag == link)
		return Get_First(T->rchild);
		
	return T; 
	

} 

ThreadBiTree Get_Next(ThreadBiTree T)	//	寻找下一个结点 
{
	if(T->rtag == Thread)
		return T->rchild;
	else
	{
	//	如果是根结点 
		if(T->parent == NULL)
			return NULL;
	//	如果是右孩子
		else if(T->parent->rchild == T)
			return  T->parent;
	//	如果是左孩子 
		else
		{
			if(T->parent->rtag == Thread)
				return T->parent;
			else
				return Get_First(T->parent->rchild);
		} 
	} 


}

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

bool Destroy_PostThreadBiTree(ThreadBiTree T)
{
	ThreadBiTree p = Get_First(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/433586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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