#ifndef childSiblingTree_H_
#define childSiblingTree_H_
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct csnode
{
char data;
csnode *firstChild,*nextSibling;
}*cstree;
void initializeTree(cstree &r)
{
r=NULL;
}
void destroyTree(cstree &r)
{
if(r)
{
if(r->firstChild)
destroyTree(r->firstChild);
if(r->nextSibling)
destroyTree(r->nextSibling);
delete r;
r=NULL;
}
}
void creatTree(cstree &r)
{
char temp[20];
cstree front,fc;
queue<cstree>Q;
int i,len;
printf("Input the root of the tree(char type).\n");
scanf("%c%*c",&temp[0]);//
if(temp[0]!='#')
{
r = new csnode;
r->data=temp[0];
r->nextSibling=NULL;
Q.push(r);
while(!Q.empty())
{
front=Q.front();
Q.pop();
printf("Please input all children of %c.\n",front->data);
gets(temp);
len=strlen(temp);
if(len>0)
{
fc=front->firstChild=new csnode;
fc->data=temp[0];
for(i=1;i<len;i++)
{
Q.push(fc);
fc->nextSibling=new csnode;
fc=fc->nextSibling;
fc->data=temp[i];
}
fc->nextSibling=NULL;
Q.push(fc);
}
else
front->firstChild=NULL;
}
}
else
r=NULL;
}
void preOrder(cstree r)
{
if(r)
{
cout<<r->data<<" ";
preOrder(r->firstChild);
preOrder(r->nextSibling);
}
}
void postOrder(cstree r)
{
cstree p;
if(r)
{
if(r->firstChild)
{
postOrder(r->firstChild);
p=r->firstChild->nextSibling;
while(p)
{
postOrder(p);
p=p->nextSibling;
}
}
cout<<r->data<<" ";
}
}
void levelOrder(cstree r)
{
cstree p;
queue<cstree>Q;
if(r)
{
cout<<r->data<<" ";
Q.push(r);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p->firstChild)
{
p=p->firstChild;
cout<<p->data<<" ";
Q.push(p);
while(p->nextSibling)
{
p=p->nextSibling;
cout<<p->data<<" ";
Q.push(p);
}
}
}
}
}
#endif
测试:
#include <iostream>
#include "csTree.h"
using namespace std;
int main()
{
cstree root;
initializeTree(root);
creatTree(root);
cout<<"pre:"<<endl;
preOrder(root);
cout<<endl;
cout<<"post:"<<endl;
postOrder(root);
cout<<endl;
cout<<"lever:"<<endl;
levelOrder(root);
return 0;
}