题目:将带度数的后根次序法表示的森林用兄弟孩子表示
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <vector>
#define PI acos(-1)
#define INF 1e18
#define inf 1e9
#define IOS ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define Si(i) scanf("%d",&i)
#define Pi(i) printf("%d\n",i);
#define ElemType int
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int _max = 1e5+50;
const ll mod = 1e9+7;
int degree[_max];
char s[_max];
typedef struct node{
char data;
node *child;
node *brother;
}*T;
void add(node *parent,node *child){
if(parent->child != NULL){
T p = parent->child;
parent->child = child;
child->brother = p;
}
else parent->child = child;
}
void Pre_Order(node *p){
if(p == NULL) return ;
cout<<p->data<<' ';
Pre_Order(p->child);
Pre_Order(p->brother);
}
int main(){
int i = 0,j;
while(cin>>degree[i])
if(degree[i] != -1) cin>>s[i++];
else break;
int len = i;
T Tree= (node *)malloc(len*sizeof(node));
for(i = 0 ; i < len ; i++){
Tree[i].data = s[i];
Tree[i].child = NULL;
Tree[i].brother = NULL;
}
int cnt = 0;
while(cnt < len-1){
for(i = 0 ; i < len-1 ; i++) if(degree[i] > 1) break;
for(j = i-1 ; j > 0 ; j--) if(degree[j] == 1) break;
cout<<Tree[i].data<<' '<<Tree[j].data<<endl;
cout<<degree[i]<<' '<<degree[j]<<endl;
add(&Tree[i],&Tree[j]);
degree[i]--;
degree[j]--;
cnt++;
}
Pre_Order(&Tree[len-1]);
return 0;
}