数据结构之线索二叉树

/*
	线索二叉树
*/
#include
#include

//线索存储标志位
//Link(0):表示指向左右孩子的指针
//Thread(1):表示指向前驱后继的线索
typedef enum{Link,Thread}PointerTag;

typedef struct BiThrNode
{
	char data;
	struct BiThrNode *lchild,*rchild;
	PointerTag ltag;
	PointerTag rtag;
}BiThrNode,*BiThrTree;

//全局变量,始终指向刚访问过的节点
BiThrTree pre;

//创建一颗二叉树,约定用户遵照前序遍历的方式输入数据
void createBiThrTree(BiThrTree *);

//中序遍历线索化
void InThreading(BiThrTree);

void InorderThreading(BiThrTree *,BiThrTree);

void main()
{
	BiThrTree P,T=NULL;
	createBiThrTree(&T);
	InorderThreading(&P,T);
}

void createBiThrTree(BiThrTree *T)
{
	char c;
	scanf("%c",&c);
	if(c==' ')
	{
		*T=NULL;
	}else{
		*T=(BiThrNode *)malloc(sizeof(BiThrNode));
		(*T)->data=c;
		(*T)->ltag=Link;
		(*T)->rtag=Link;
		createBiThrTree(&(*T)->lchild);
		createBiThrTree(&(*T)->rchild);
	}
}

void InThreading(BiThrTree T)
{
	if(T)
	{
		InThreading(T->lchild);

		if(!T->lchild)//前驱线索
		{
			T->ltag=Thread;
			T->lchild=pre;
		}

		if(!pre->rchild)
		{
			pre->rtag=Thread;
			pre->rtag=T;
		}

		pre=T;

		InThreading(T->rchild);
	}
}	

void InorderThreading(BiThrTree *p,BiThrTree T)
{
	*p=(BiThrNode *)malloc(sizeof(BiThrNode));
	(*p)->ltag=Link;
	(*p)->rtag=Thread;
	(*p)->rchild=*p;
	if(!T)
	{
		(*p)->lchild=*p;
	}else{
		(*p)->lchild=T;
		pre=*p;
		InThreading(T);
		pre->rchild=*p;
		pre->rtag=Thread;
		(*p)->rchild=pre;
	}
}

数据结构之线索二叉树_第1张图片

你可能感兴趣的:(技术爱好)