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;
struct TreeNode {
TreeNode *left, *right;
};
int numBranches;
TreeNode *CreateTree() {
TreeNode *node = nullptr;
char c;
cin >> c;
if (c != '0') {
node = new TreeNode;
node->left = nullptr;
node->right = nullptr;
int count = 1;
while (!node->left && count <= numBranches) {
node->left = CreateTree();
count++;
}
TreeNode *current = node->left;
for (; count <= numBranches; count++) {
TreeNode *temp = CreateTree();
if (temp != nullptr) {
current->right = temp;
current = temp;
}
}
}
return node;
}
void GenerateCodes(TreeNode *node, string code) {
if (node->left)
GenerateCodes(node->left, code + "0");
if (node->right)
GenerateCodes(node->right, code + "1");
if (!node->left && !node->right) {
cout << code[0];
for (int i = 1; i < code.length(); i++)
cout << ' ' << code[i];
cout << endl;
}
}
int main() {
int numNodes;
cin >> numNodes >> numBranches;
TreeNode *trees[numNodes];
for (int i = 0; i < numNodes; i++)
trees[i] = CreateTree();
for (int i = 0; i < numNodes - 1; i++)
trees[i]->right = trees[i + 1];
GenerateCodes(trees[0], "");
return 0;
}