#include <iostream>
#include <cstring>
using namespace std;
typedef char TElemType;
typedef struct TNode {
TElemType data;
TNode* parent,*fc,*ns;
}FNode,*tree,*forest;
void createTree(TElemType* preOrder, int& pos, tree& root, tree* nodes) {
TElemType data = preOrder[pos++];
if (data == '#') {
root = NULL;
return;
}
root = new TNode{data, NULL, NULL, NULL};
nodes[data - 'a'] = root;
createTree(preOrder, pos, root->fc, nodes);
if (root->fc != NULL) {
root->fc->parent = root;
}
createTree(preOrder, pos, root->ns, nodes);
if (root->ns != NULL) {
root->ns->parent = root->parent;
}
}
forest createForest(TElemType* preOrder, int numTrees) {
tree nodes[26] = {NULL};
forest result = NULL;
int pos = 0;
for (int i = 0; i < numTrees; i++) {
tree root = NULL;
createTree(preOrder, pos, root, nodes);
if (result == NULL) {
result = root;
}
else {
tree p = result;
while (p->ns != NULL) {
p = p->ns;
}
p->ns = root;
}
}
return result;
}
void printForest(forest f) {
while (f != NULL) {
cout << f->data << ": ";
tree p = f->fc;
while (p != NULL) {
cout << p->data << " ";
p = p->ns;
}
cout << endl;
f = f->ns;
}
}
int main() {
TElemType preOrder[] = {'a', 'b', 'd', '#', '#', '#', 'c', 'e', '#', 'f', '#', '#', '#'};
forest f = createForest(preOrder, 2);
printForest(f);
return 0;
}加上中文注释
#include <iostream>
#include <cstring>
using namespace std;
typedef char TElemType;
typedef struct TNode {
TElemType data; // 存储结点的数据
TNode* parent,*fc,*ns; // 分别指向父节点、第一个孩子节点和下一个兄弟节点
}FNode,*tree,*forest; // FNode是自定义类型,tree和forest是指向FNode类型的指针
void createTree(TElemType* preOrder, int& pos, tree& root, tree* nodes) {
TElemType data = preOrder[pos++]; // 取出当前位置的元素
if (data == '#') { // 如果是空结点,直接返回
root = NULL;
return;
}
root = new TNode{data, NULL, NULL, NULL}; // 创建新节点
nodes[data - 'a'] = root; // 将新节点存入数组中
createTree(preOrder, pos, root->fc, nodes); // 递归创建左子树
if (root->fc != NULL) { // 如果有左子树,将其父节点指向根节点
root->fc->parent = root;
}
createTree(preOrder, pos, root->ns, nodes); // 递归创建右子树
if (root->ns != NULL) { // 如果有右子树,将其父节点指向根节点的父节点
root->ns->parent = root->parent;
}
}
forest createForest(TElemType* preOrder, int numTrees) {
tree nodes[26] = {NULL}; // 存储每个节点的指针,最多只有26个字母
forest result = NULL; // 最终的森林
int pos = 0; // 用于记录当前位置
for (int i = 0; i < numTrees; i++) { // 循环创建多棵树
tree root = NULL;
createTree(preOrder, pos, root, nodes); // 递归创建树
if (result == NULL) { // 如果是第一棵树,直接赋值为根节点
result = root;
}
else { // 如果不是第一棵树,则将根节点插入到森林的最后一棵树的后面
tree p = result;
while (p->ns != NULL) { // 找到最后一棵树
p = p->ns;
}
p->ns = root; // 将根节点插入到最后一棵树的后面
}
}
return result; // 返回最终的森林
}
void printForest(forest f) { // 打印森林
while (f != NULL) { // 循环遍历森林中的每一棵树
cout << f->data << ": "; // 先打印根节点的数据
tree p = f->fc; // 从根节点的第一个孩子节点开始遍历
while (p != NULL) { // 循环遍历孩子节点
cout << p->data << " "; // 打印孩子节点的数据
p = p->ns; // 指向下一个兄弟节点
}
cout << endl; // 每一棵树打印完后换行
f = f->ns; // 指向下一棵树
}
}
int main() {
TElemType preOrder[] = {'a', 'b', 'd', '#', '#', '#', 'c', 'e', '#', 'f', '#', '#', '#'}; // 先序遍历序列
forest f = createForest(preOrder, 2); // 创建森林
printForest(f); // 打印森林
return 0;
}
使用程序框展现这些代码
// 头文件
#include <iostream>
#include <cstring>
using namespace std;
// 定义结构体
typedef char TElemType;
typedef struct TNode {
TElemType data;
TNode* parent,*fc,*ns;
}FNode,*tree,*forest;
// 创建一棵树
void createTree(TElemType* preOrder, int& pos, tree& root, tree* nodes) {
TElemType data = preOrder[pos++];
if (data == '#') {
root = NULL;
return;
}
root = new TNode{data, NULL, NULL, NULL};
nodes[data - 'a'] = root;
createTree(preOrder, pos, root->fc, nodes);
if (root->fc != NULL) {
root->fc->parent = root;
}
createTree(preOrder, pos, root->ns, nodes);
if (root->ns != NULL) {
root->ns->parent = root->parent;
}
}
// 创建森林
forest createForest(TElemType* preOrder, int numTrees) {
tree nodes[26] = {NULL};
forest result = NULL;
int pos = 0;
for (int i = 0; i < numTrees; i++) {
tree root = NULL;
createTree(preOrder, pos, root, nodes);
if (result == NULL) {
result = root;
}
else {
tree p = result;
while (p->ns != NULL) {
p = p->ns;
}
p->ns = root;
}
}
return result;
}
// 打印森林
void printForest(forest f) {
while (f != NULL) {
cout << f->data << ": ";
tree p = f->fc;
while (p != NULL) {
cout << p->data << " ";
p = p->ns;
}
cout << endl;
f = f->ns;
}
}
int main() {
TElemType preOrder[] = {'a', 'b', 'd', '#', '#', '#', 'c', 'e', '#', 'f', '#', '#', '#'};
forest f = createForest(preOrder, 2);
printForest(f);
return 0;
}
加上注释
// 头文件
#include <iostream>
#include <cstring>
using namespace std;
// 定义结构体
typedef char TElemType; // 定义树中结点的数据类型
typedef struct TNode {
TElemType data; // 存储结点的数据
TNode* parent,*fc,*ns; // 分别指向父节点、第一个孩子节点和下一个兄弟节点
}FNode,*tree,*forest; // FNode是自定义类型,tree和forest是指向FNode类型的指针
// 创建一棵树
void createTree(TElemType* preOrder, int& pos, tree& root, tree* nodes) {
TElemType data = preOrder[pos++]; // 取出当前位置的元素
if (data == '#') { // 如果是空结点,直接返回
root = NULL;
return;
}
root = new TNode{data, NULL, NULL, NULL}; // 创建新节点
nodes[data - 'a'] = root; // 将新节点存入数组中
createTree(preOrder, pos, root->fc, nodes); // 递归创建左子树
if (root->fc != NULL) { // 如果有左子树,将其父节点指向根节点
root->fc->parent = root;
}
createTree(preOrder, pos, root->ns, nodes); // 递归创建右子树
if (root->ns != NULL) { // 如果有右子树,将其父节点指向根节点的父节点
root->ns->parent = root->parent;
}
}
// 创建森林
forest createForest(TElemType* preOrder, int numTrees) {
tree nodes[26] = {NULL}; // 存储每个节点的指针,最多只有26个字母
forest result = NULL; // 最终的森林
int pos = 0; // 用于记录当前位置
for (int i = 0; i < numTrees; i++) { // 循环创建多棵