把压仓底的东西拿出来,其实我一直觉得树也可以用广义表那种读书写形式串的模式建立.
/*二叉树的存储结构和遍历*/
/*注意:输入数据时要求按双亲、数据、左右标志的顺序,输入数据时输入#则结束*/
/*程序以以下数据通过测试:
# 1 0
1 2 l
1 3 r
*/
#include <iostream.h>
#define max 100class Tree
{
private:
int data;
Tree* lchild;
Tree* rchild;
public:
Tree()
{
lchild=NULL;
rchild=NULL;
}
void DisplayDLR(Tree *t);
void DisplayLDR(Tree* t);
void DisplayLRD(Tree* t);
Tree* Create();
};Tree* Tree::Create()
{
Tree *root,*p,*q,*stack[max];
char a,b,c;
int i=0,j=0;
root=NULL;
while(1==1)
{
cout<<\"请输入双亲,若是根结点则输入#:\";
cin>>a;
cout<<\"输入要存储的数据:\";
cin>>b;
cout<<\"输入左右标志以判断结点的关系:\";
cin>>c;
if(b=='#')
break;
if(a=='#')
{
p=new Tree;
p->data=b;
root=p;
stack[i++]=p;
}
else
{
p=new Tree;
p->data=b;
while(1==1)
{
q=stack[j];
if(q->data==a)
{
if(c=='l')
q->lchild=p;
else
q->rchild=p;
stack[i++]=p;
break;
}
else
{
stack[j]=NULL;
j++;
}
}
}
}
return root;
}
/***********先序遍历************/
void Tree::DisplayDLR(Tree *t)
{
if(t==NULL)
return;
cout<<t->data<<'t';
if(t->lchild!=NULL)
DisplayDLR(t->lchild);
if(t->rchild!=NULL)
DisplayDLR(t->rchild);
}
/***********中序遍历************/
void Tree::DisplayLDR(Tree *t)
{
if(t==NULL)
return;
if(t->lchild!=NULL)
DisplayLDR(t->lchild);
cout<<t->data<<'t';
if(t->rchild!=NULL)
DisplayLDR(t->rchild);
}
/***********后序遍历************/
void Tree::DisplayLRD(Tree *t)
{
if(t==NULL)
return;
if(t->lchild!=NULL)
DisplayLRD(t->lchild);
if(t->rchild!=NULL)
DisplayLRD(t->rchild);
cout<<t->data<<'t';
}void main()
{
Tree* t1;
Tree tree;
cout<<\"输入数据,构建二叉树:\"<<endl;
t1=tree.Push();
cout<<\"先序遍历此二叉树:\"<<endl;
tree.DisplayDLR(t1);
cout<<\"中序遍历此二叉树:\"<<endl;
tree.DisplayLDR(t1);
cout<<\"后序遍历此二叉树:\"<<endl;
tree.DisplayLRD(t1);
}
[此贴子已经被作者于2007-6-3 20:30:39编辑过]
Viva,espana!