DS森林叶子编码

题目描述

给定一组森林,编写程序生成对应的二叉树,输出这颗二叉树叶结点对应的二进制编码.规定二叉树的左边由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;
}
上一篇:二叉树最深层次元素求和(基于层序遍历算法)


下一篇:C语言数据结构——树和二叉树