数据结构-线索二叉树

(1)线索二叉树

我只能说很难的了

#include<bits/stdc++.h>
using namespace std;
typedef char ElemType;
struct ThreadNode{
	ElemType data;
	ThreadNode *lchild;
	ThreadNode *rchild;
	int ltag;
	int rtag;
};
typedef ThreadNode* ThreadTree;
string str="ABDH#K###E##CFI###G#J##";
int indx=0;
ThreadTree prev;
void createTree(ThreadTree *T)
{
	ElemType ch;
	ch=str[indx++];
	if(ch=='#')
	{
		*T=NULL;
	}
	else
	{
		*T=new ThreadNode;
		(*T)->data=ch;
		createTree(&(*T)->lchild);//&的优先级最小 
		if((*T)->lchild!=NULL)
		{
			(*T)->ltag=0;
		}
		createTree(&(*T)->rchild);
		{
			(*T)->rtag=0;
		}
	}
}
void threading(ThreadTree T)
{
	if(T!=NULL)
	{
		threading(T->lchild);
		if(T->lchild==NULL)
		{
			T->ltag=1;
			T->lchild=prev;
		}
		if(prev->rchild==NULL)
		{
			prev->rtag=1;
			prev->rchild=T;
		}
		prev=T;//相当于中序遍历的输出 
		threading(T->rchild);//相当于中序遍历 
	}
}
void inOrderThreading(ThreadTree *head,ThreadTree T)
{
	*head =new ThreadNode;
	(*head)->ltag=0;
	(*head)->rtag=1;
	(*head)->rchild=(*head);
	if(T==NULL)
	{
		(*head)->lchild=*head;
	}
	else
	{
		(*head)->lchild=T;
		prev=(*head);
		threading(T);
		//最后一个节点线索化 
		prev->rchild=*head;
		prev->rtag=1;
		//头节点右孩子指向最后一个结点
		(*head)->rchild=prev; 
	}
}
void inOrder(ThreadTree T)
{
	ThreadTree curr;
	curr=T->lchild;
	while(curr!=T)
	{
		while(curr->ltag==0)
		{
			curr=curr->lchild;
		}
		cout<<curr->data;
		while(curr->rtag==1&&curr->rchild!=T)
		{
			curr=curr->rchild;
			cout<<curr->data;
		}
		curr=curr->rchild;
	}
	cout<<endl;
}

int main()
{
	ThreadTree head;
	ThreadTree T;
	createTree(&T);
	inOrderThreading(&head,T);
	inOrder(head);
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务