树的创建与遍历

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值