数据结构之C++实现树的建立及前序遍历_中序遍历_后序遍历
#include <iostream>
using namespace std;
#define MAX_TREE_SIZE 50
struct PTNode
{
int data;
int parent;
};
class PTTree
{
public:
PTNode nodes[MAX_TREE_SIZE];
int r,n;
};
struct CTNode
{
int child;
CTNode* next;
};
struct CTBox
{
int data;
CTNode* firstchild;
};
class CTree
{
public:
CTBox nodes[MAX_TREE_SIZE];
int r,n;
};
struct CSNode
{
int data;
CSNode* firstchild;
CSNode* rightsib;
};
struct BitNode
{
char data;
BitNode* lchild;
BitNode* rchild;
};
class BitTree
{
public:
void PreOrderTraverse(BitNode* T);
void InOrderTraverse(BitNode* T);
void PostOrderTraverse(BitNode* T);
void CreatBitTree(BitNode** T);
};
void BitTree::PreOrderTraverse(BitNode* T)
{
if(T==NULL)
{
cout<<"Node is empty!!!"<<endl;
exit(1);
}
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void BitTree::InOrderTraverse(BitNode* T)
{
if(T==NULL)
{
cout<<"Node is empty!!!"<<endl;
exit(1);
}
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
void BitTree::PostOrderTraverse(BitNode* T)
{
if(T==NULL)
{
cout<<"Node is empty!!!"<<endl;
exit(1);
}
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
void BitTree::CreatBitTree(BitNode** T)
{
char ch;
cin>>ch;
if(ch=='#') *T=NULL;
else
{
*T=new BitNode;
if(!*T)
{
cout<<"new is fail"<<endl;
exit(1);
}
(*T)->data=ch;
CreatBitTree(&(*T)->lchild);
CreatBitTree(&(*T)->rchild);
}
}
struct BiThrNode
{
int data;
BiThrNode* lchild;
BiThrNode* rchild;
int LTag;
int RTag;
};
class BiThrTree
{
public:
void InThreading(BiThrNode* T);
void InOrderTraverse_Thr(BiThrNode* T);
void CreatBiThrTree(BiThrNode** T);
};
static BiThrNode* pre;
void BiThrTree::InThreading(BiThrNode* T)
{
if(T!=NULL)
{
InThreading(T->lchild);
if(T->lchild==NULL)
{
T->LTag=1;
T->lchild=pre;
}
if(pre->rchild==NULL)
{
pre->RTag=1;
pre->rchild=T;
}
pre=T;
InThreading(T->rchild);
}
}
void BiThrTree::InOrderTraverse_Thr(BiThrNode* T)
{
BiThrNode* p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==0)
p=p->lchild;
cout<<p->data<<" ";
while(p->RTag==1 && p->rchild!=T)
{
p=p->rchild;
cout<<p->data<<" ";
}
p=p->rchild;
}
}
void BiThrTree::CreateBiThrTree(BitNode** T)
{
int h;
cin>>h;
if(h=='#')
*T=NULL;
else
{
T=new BiThrNode;
if(!*T)
exit(OVERFLOW);
(*T)->data=h;
CreateBiThrTree(&(*T)->lchild);
if((*T)->lchild)
(*T)->LTag=Link;
CreateBiThrTree(&(*T)->rchild);
if((*T)->rchild)
(*T)->RTag=Link;
}
}
int main()
{
BiThrTree* T;
cout<<"请按前序输入二叉树(如:'ABDH##I##EJ###CF##G##')"<<endl;
T->CreatBiThrTree(&T);
T->InOrderThreading(T);
cout<<"中序遍历(输出)二叉线索树:"<<endl;
T->InOrderTraverse_Thr(H);
cout<<endl;
return 0;
}