#include
#include
#define max 20
typedef struct node{
char data;
node *child,*brother;
}Tree;
Tree *Q1[max]; //用于记录父结点Tree *Q2[max]; //用于记录兄弟结点int front1=0,rear1=-1,front2=0,rear2=-1; Tree *Creatree(){ //创建以孩子兄弟链表为存储结构的树
Tree *T,*S;
char pa,ch;
int sign=0;
T=NULL;
printf("建立树,请输入结点信息及其父结点信息:\n");
scanf("%c%c",&ch,&pa);
while(ch!='#'){
int stop=1;
S=(Tree *)malloc(sizeof(Tree));
S->data=ch;
S->child=S->brother=NULL;
rear1++;
Q1[rear1]=S;
if(pa!='@'){ //父结点不为空
rear2++;
Q2[rear2]=S;
while(stop){
if(pa==Q1[front1]->data&&sign==0){
Q1[front1]->child=S;
sign=1;
stop=0;
}
else
if(pa==Q1[front1]->data&&sign!=0){
Q2[front2]->brother=S;
front2++;
stop=0;
}
else{
front1++;
if(Q2[front2]->data!=ch)
front2++;
sign=0;
}
}
scanf("%c%c",&ch,&pa);
}
else{ //父结点为空
T=Q1[front1];
scanf("%c%c",&ch,&pa);
}
}
return T;
}
Tree *WHOLE=NULL; //设置全局变量,来存储树中与结点x值相等的结点
void Seek_root(Tree *T,Tree *x){ //在树中查找与结点x值相等的结点
if(T!=NULL){
if(T->data==x->data)
WHOLE=T;
else{
Seek_root(T->child,x);
Seek_root(T->brother,x);
}
}
}
Tree *Search_child(Tree *T,Tree *x,int i){ //查找结点x的第i个孩子
Tree *p,*q;
int mark=1;
Seek_root(T,x);
if(WHOLE==NULL) //结点x没有第i个孩子
q=WHOLE;
else{ //结点x有第i个孩子
q=WHOLE->child;
while(mark!=i){
q=q->brother;
mark++;
}