线索化二叉树

#include <stdio.h>
#include <stdlib.h>

typedef char Element;

//0代表孩子节点,1代表线索
enum PointerTag { Link,Thread };

typedef struct BiThrNdoe
{
	Element date;
	PointerTag ltag,rtag;
	BiThrNdoe* lchild;
	BiThrNdoe* rchild;

}BiThrNdoe,*BiThrTree;

BiThrTree pre;

//前序创建二叉树
void CreateBiThrTree(BiThrTree *T)
{
	char c;

	scanf("%c",&c);
	if(' '==c)
	{
		*T=NULL;
	}
	else
	{
		*T=(BiThrNdoe *)malloc(sizeof(BiThrNdoe ));
		(*T)->date=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->rchild=T;
		}
		pre=T;

		InThreading(T->rchild);
	}

}

//中序遍历线索化
void InOrderThreading(BiThrTree *p,BiThrTree T)
{
	*p=(BiThrTree)malloc(sizeof(BiThrNdoe));
	(*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;
	}
}

//打印
void Visit(char c)
{
	printf("%c ",c);
}

//中序遍历
void InOrderTraverse(BiThrTree T)
{
	BiThrTree p;
	p=T->lchild;

	while(p!=T)
	{
		while(p->ltag==Link)
		{
			p=p->lchild;
		}
		Visit(p->date);

		if(p->rtag==Thread  && p->rchild !=T)
		{
			p=p->rchild;
			Visit(p->date);
		}
		p=p->rchild;
	}
}

int main()
{
	BiThrTree P,T=NULL;

	CreateBiThrTree(&T);
	InOrderThreading(&P,T);
	
	printf("中序遍历结果为:");

	InOrderTraverse(P);

	printf("\n");

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值