10-赫夫曼编码及综合-
题目描述
给定一组森林,编写程序生成对应的二叉树,输出这颗二叉树叶结点对应的二进制编码.规定二叉树的左边由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
->如果把森林中的第二棵树的根节点看作是第一棵树的根结点的兄弟,则可以找到一个唯一的二叉树与之对应。
->兄弟变右孩子,左孩子变左孩子
->(森林转二叉树,新树接入右孩子)
//给定森林,生成对应的二叉树,输出这颗二叉树结点对应的二进制编码
//create多叉树
//多叉树各自转二叉树
//转成一个二叉树
//coding编码
#include<iostream>
using namespace std;
int N,B;//N个树,每结点最多B个分支
class treenode//多叉树结点
//多叉树的构造:多叉树的结点结构中,指向孩子的指针应该是二级指针,它需要根据用户的输入动态分配孩子的数目。函数传入根结点,返回根结点,在函数内部使用循环对每个孩子结点进行构造即可。
//因为是动态分配所以不用new两次
{
char data;
treenode **child;
public:
treenode()
{
child=new treenode*[B];
for(int i=0;i<B;i++)
child[i]=NULL;
}
~treenode()
{
delete []child;}
friend class forest;
};
class binode//二叉树结点
{
char data;
binode *lchild,*rchild;
binode():