树的创建与遍历
使用孩子链表表示法表示数,采用广义表的形式输入:
#define ms 5//数的度 typedef struct node{//树的孩子链表表示法 char data; node* p[ms]; }*Tree; void createTree(Tree& tree,char* p){ tree=NULL; Tree stack[ms],currentNode;//stack记录当前层次对应的双亲节点 int d[ms];//记录 int i=0,top=0; while(p[i]){ switch(p[i]){ case ' ':break; case'(': top++;//层次+1 stack[top]=currentNode;//当前层次所属的双亲节点 d[top]=0;//当前层次至少一个孩子节点 break; case')': top--;//层次-1,一个层次结束 break; case',': d[top]++;stack[top]为双亲所对应的孩子数 break; default: //创建节点 if((currentNode=(Tree)malloc(sizeof(node)))){ currentNode->data=p[i]; for(int j=0;j<ms;j++) currentNode->p[j]=NULL; } //连接第d[top]个孩子与其双亲节点stack[top] if(!tree) tree=currentNode; else stack[top]->p[d[top]]=currentNode; } i++; } } //数的输出 void printTree(Tree tree){ if(tree){ cout<<tree->data; if(tree->p[0]){ cout<<"("; printTree(tree->p[0]); for(int i=1;tree->p[i]&&i<5;i++){ cout<<","; printTree(tree->p[i]); } cout<<")"; } } }