/'先序遍历'/
#include<iostream>
#include<cstring>
using namespace std;
int n,k;
class Node{//树结点
public:
char d;
Node **p;
Node(){
p=new Node*[k];
}
};
class BNode{//二叉树结点
public:
char bd;
BNode *first,*next;
};
class Tree{//树
public:
int pos;
string ts;
Node *r;
Tree(string s){
pos=0;
ts.assign(s);
r=Create();
}
Node* Create(){
if(ts[pos]=='0'){
pos++;
return NULL;
}
Node *q=new Node();
q->d=ts[pos];
pos++;
for(int i=0;i<k;i++)
q->p[i]=Create();
return q;
}
BNode* toBTree(Node *T){
BNode *q=NULL;
if(T){
q=new BNode();
q->bd=T->d;
int i=0;
while(!T->p[i]&&i<k) i++;
if(i==k)
q->first=toBTree(NULL);
else
q->first=toBTree(T->p[i]);
if(q->first){
BNode *w=q->first;
for(int j=i+1;j<k;j++){
w->next=toBTree(T->p[j]);
if(w->next) w=w->next;
}
}
}
return q;
}
};
class BTree{//二叉树
public:
BNode *br;
BTree(Tree T){
br=T.toBTree(T.r);
}
};
void Code(BNode *p,string s){
if(!p->first&&!p->next){//编完后打印输出
for(int i=0;i<s.length();i++){
if(i)
cout<<" ";
cout<<s[i];
}
cout<<endl;
}
if(p->first)
Code(p->first,s+'0');
if(p->next)
Code(p->next,s+'1');
}
int main(){
BNode *x;
cin>>n>>k;
for(int i=0;i<n;i++){
char c;
string s;
while(cin>>c){
s+=c;
if(getchar()=='\n')
break;
}
Tree tree(s);
BTree btree(tree);
if(i==0)
x=btree.br;
else{
BNode *y=x;
while(y->next)
y=y->next;
y->next=btree.br;
}
}
Code(x,"");
return 0;
}
森林叶子编码C++(森林转二叉树)
于 2023-12-26 22:55:26 首次发布