中序线索二叉树基本操作的实现

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef enum{
    
    Link,Thread} PointTag;
struct BinThreadTree
{
    
    
	int data;
	BinThreadTree* lchild;
	BinThreadTree* rchild;
	PointTag LTag;
	PointTag RTag;
};
int create(BinThreadTree*(&T))
{
    
    
	int num;
	cin>>num;
	if(num==-1)
	{
    
    
		T=NULL;
		return 0;
	}
	else
	{
    
    
		T=(BinThreadTree*)malloc(sizeof(BinThreadTree));
		T->data=num;
		cout<<"请输入节点"<<num<<"的左节点的值:"<<endl;
		create(T->lchild);
		cout<<"请输入节点"<<num<<"的右节点的值:"<<endl;
		create(T->rchild);
	}
}
BinThreadTree* pre;
int InThreading(BinThreadTree* p)
{
    
    
	if(p)
	{
    
    
		InThreading(p->lchild);
		if(!p->lchild){
    
    p->LTag=Thread;p->lchild=pre;}
		else{
    
    p->LTag=Link;}
		if(!pre->rchild){
    
    pre->RTag=Thread;pre->rchild=p;}
		else{
    
    pre->RTag=Link;}
		pre=p;
		InThreading(p->rchild);
	}
}
int InOrderThreading(BinThreadTree* (&Thrt),BinThreadTree* T)
{
    
    
	Thrt=(BinThreadTree*)malloc(sizeof(BinThreadTree));
	Thrt->LTag=Link;Thrt->RTag=Thread;
	Thrt->rchild=Thrt;
	if(!T)Thrt->lchild=Thrt;
	else
	{
    
    
		Thrt->lchild=T;pre=Thrt;
		InThreading(T);
		pre->RTag=Thread;
		pre->rchild=Thrt;
		Thrt->rchild=pre;
	}
}
int InOrderTraverse(BinThreadTree* Thrt)
{
    
    
	BinThreadTree* p=Thrt->lchild;
	while(p!=Thrt)
	{
    
    
		while(p->LTag==Link)p=p->lchild;
		cout<<p->data<<" ";
		while(p->RTag==Thread&&p->rchild!=Thrt)
		{
    
    
			p=p->rchild;
			cout<<p->data<<" "; 
		}
		p=p->rchild;
	}
	cout<<endl;
}
int main()
{
    
    
	BinThreadTree* T,* Thrt;
	cout<<"请输入根节点的值,输入-1表示该树为空树"<<endl;
	create(T);
	InOrderThreading(Thrt,T);
	cout<<"中序遍历的结果为:"<<endl;
	InOrderTraverse(Thrt);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/AlberTesla/article/details/109082860