攻城狮凌风

树的创建与遍历

   使用孩子链表表示法表示数,采用广义表的形式输入:

#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<<")";
		}
	}
}


posted on 2015-04-22 22:20  攻城狮凌风  阅读(182)  评论(0编辑  收藏  举报

导航