中序线索二叉树

#include<stdio.h>
#include<stdlib.h>
typedef enum PointerTag
{
	Thread,
	Point
};

typedef struct node
{
	char data;
	PointerTag lTag,rTag;
	struct node* lChild;
	struct node* rChild;
}Tree,TreeNode,*BinTree;

BinTree pre;
int creatTree(BinTree& pTree)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
	{
		pTree=NULL;
	}
	else
	{
		pTree=(BinTree)malloc(sizeof(Tree));
		pTree->data=ch;//生成父节点 
		pTree->lTag=Point;
		pTree->rTag=Point;//在线索化的时候,把一部分tag改成Thread 
		creatTree(pTree->lChild);//建立左子数 
		creatTree(pTree->rChild);//建立右子数 
		return 0;
	}
}

void inThreading(BinTree tree)//中序线索二叉树 
{
	if(tree)
	{
		inThreading(tree->lChild);
		if(!(tree->lChild))
		{
			tree->lTag=Thread;
			tree->lChild=pre;
		}
		if(!(pre->rChild))
		{
			pre->rTag=Thread;
			pre->rChild=tree;
		}
		pre=tree;
		inThreading(tree->rChild);
	}
}

void inOrderThreading(BinTree& pHead,BinTree tree)
{
	pHead=(BinTree)malloc(sizeof(Tree));
	
	pHead->lTag=Point;//初始化pHead的标签 
	pHead->rTag=Thread;
	pHead->lChild=tree;//头的左指针指树 
	pHead->rChild=pHead;//头的右指针回指 (先不让pHead->rChild为空,最后再让它指向遍历的最后一个节点)
	if(!tree)
	{
		pHead->lChild=pHead;//如果树是空树,那么pHead左指针回指 
	}
	else
	{
		pre=pHead;
		inThreading(tree);//遍历完成,这时pre指向遍历的最后一个节点 
		
		pre->rTag=Thread;//最后一个节点线索化,把最后一个节点的rChild指向pHead。注意:只有先序和中序遍历时,最后一个访问的节点的rTag才是Thread 
		pre->rChild=pHead;
		pHead->rChild=pre;//把pHead的rChild指向遍历的最后一个节点 (形成一个环) 
	}
}


int travelTree(BinTree pHead)//二叉树的中序线索遍历 
{
	BinTree p;
	p=pHead->lChild;
	while(p!=pHead)
	{
		while(p->lTag!=Thread)
		{
			p=p->lChild;
		}
		printf("%c",p->data);
		while((p->rTag==Thread)&&(p->rChild!=pHead))
		{
			p=p->rChild;
			printf("%c",p->data);
		}
		p=p->rChild;
	}
	return 0;
}
//某个节点的后继是其右子树的最后一个节点,也就是右子树最左下的节点 

int main()
{
	BinTree pHead=NULL,tree=NULL;
	creatTree(tree);
	preOrderTraversal(tree);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值