线索二叉树的实现

实现需要注意的地方:

1、对指针的操作不太熟悉的朋友,可以使用c++提供的引用方式实现,int i;int *p;int **pi;p=&i;pi=&p; **pi、*pi、*p的操作(修改)分别是对那些变量有影响?你能回答么?

2、知道为什么要定义BiThrNode和*BiThrTree类型么?

3、如果还有疑问欢迎一起探讨。


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

typedef enum {link,thread} PointerTag;

typedef char TElemType;

typedef struct BiThrNode
{
	TElemType data;
	struct BiThrNode *lchild,*rchild;
	PointerTag	lTag,rTag;
}BiThrNode,*BiThrTree;

BiThrTree pre;


void createBiThrTree(BiThrTree * T)//也可以使用引用类型(BiThrTree &T),但代码就不一样了,*T改为T就可以了
{
	TElemType cData;
	scanf("%c",&cData);
	if (' '==cData)
	{
		*T=NULL;
	}
	else
	{
		*T=(BiThrTree)malloc(sizeof(BiThrNode));
		(*T)->data=cData;
		(*T)->lTag=link;
		(*T)->rTag=link;

		createBiThrTree(&((*T)->lchild));
		createBiThrTree(&((*T)->rchild));
	}
}


void InThreading(BiThrTree p)
{
	if (p)
	{
		InThreading(p->lchild);
		if (!p->lchild)
		{
			p->lTag=thread;
			p->lchild=pre;
		}
		if (!pre->rchild)
		{
			pre->rTag=thread;
			pre->rchild=p;
		}
		pre=p;
		InThreading(p->rchild);
	}
}

void InOrderThreading(BiThrTree *p,BiThrTree T)
{
	*p=(BiThrTree)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->rTag=thread;
		pre->rchild=*p;
		(*p)->rchild=pre;
	}
}

void InOrderTravse_Thr(BiThrTree T)
{
	printf("用迭代法访问线索二叉树:\n");
	BiThrTree p;
	p=T->lchild;
	while(p!=T)
	{
		while(p->lTag==link) p=p->lchild;
		printf("%c",p->data);
		while(p->rTag==thread && p->rchild!=T)
		{
			p=p->rchild;
			printf("%c",p->data);
		}
		p=p->rchild;
	}
}

int main()
{
	BiThrTree p,T=NULL;
	createBiThrTree(&T);
	InOrderThreading(&p,T);

	InOrderTravse_Thr(p);
	printf("\n");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值