题目描述
给定一组森林,编写程序生成对应的二叉树,输出这颗二叉树叶结点对应的二进制编码.规定二叉树的左边由0表示,二叉树的右边由1表示。
输入
输入:
N B 表示N个树,每结点最多B个分支
第2行至第N+1行,每个树的先序遍历
输出
每行表示一个叶结点对应的二进制编码.
样例输入
3 3 A B 0 0 0 C 0 0 0 D 0 0 0 E F 0 0 0 0 0 G H 0 0 0 I J 0 0 0 0 0 0样例输出
0 1 1 1 0 1 1 0 1 0提示
#include<iostream> #include<string> using namespace std; int B;///最多B个分支 class TreeNode///森林中的树结点 { public: char data; TreeNode **child; TreeNode() { child=new TreeNode* [B]; for(int i=0;i<B;i++) child[i]= NULL; } }; class BiTreeNode { public: char data; BiTreeNode *firstchild,*nextsibling; BiTreeNode() { firstchild=NULL; nextsibling=NULL; } }; class Tree { public: TreeNode* root; Tree() { root=CreateTree(); } TreeNode* CreateTree() { TreeNode *p=NULL; char c; cin>>c; if(c!='0') { p= new TreeNode; p->data=c; for(int k=0;k<B;k++) p->child[k]=CreateTree(); } return p; } BiTreeNode* change(TreeNode* T) { BiTreeNode *p=NULL; if(T!=NULL) { p=new BiTreeNode; p->data=T->data; p->firstchild=change(T->child[0]); if(p->firstchild!=NULL) { BiTreeNode *q=p->firstchild; for(int i=1;i<B;i++) { q->nextsibling=change(T->child[i]); if(q->nextsibling!=NULL) q=q->nextsibling; } } } return p; } }; class BiTree { public: BiTreeNode* root; void getleaves(BiTreeNode* T,string parent) { string str=parent; if(T!=NULL) { if(T->firstchild==NULL&&T->nextsibling==NULL) cout<<str<<endl; getleaves(T->firstchild,str+ "0 "); getleaves(T->nextsibling,str+ "1 "); } } void combine(BiTreeNode** T,int N) { for(int i=0;i<N-1;i++) T[i]->nextsibling=T[i+1]; root=T[0]; } }; int main() { int N; cin>>N>>B; Tree* p=new Tree[N]; BiTreeNode** Bit=new BiTreeNode* [N]; for(int i=0;i<N;i++) Bit[i]=p[i].change(p[i].root); BiTree tree; tree.combine(Bit,N); tree.getleaves(tree.root,""); return 0; }