
#include <stdio.h>
#include <stdlib.h>
// 树节点的孩子兄弟表示法
typedef struct TreeNode {
int data; // 节点数据
struct TreeNode* firstChild; // 第一个孩子指针
struct TreeNode* nextSibling; // 下一个兄弟指针
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->firstChild = NULL;
newNode->nextSibling = NULL;
return newNode;
}
// 添加孩子节点
void addChild(TreeNode* parent, TreeNode* child) {
if (parent->firstChild == NULL) {
parent->firstChild = child;
} else {
TreeNode* temp = parent->firstChild;
while (temp->nextSibling != NULL) {
temp = temp->nextSibling;
}
temp->nextSibling = child;
}
}
// 打印树结构(前序遍历)
void printTree(TreeNode* root, int level) {
if (root == NULL) return;
for (int i = 0; i < level; i++) {
printf(" ");
}
printf("%d\n", root->data);
printTree(root->firstChild, level + 1);
printTree(root->nextSibling, level);
}
// 森林结构(多棵树的集合)
typedef struct Forest {
TreeNode** trees; // 树指针数组
int count; // 树的数量
} Forest;
// 创建森林
Forest* createForest(int treeCount) {
Forest* forest = (Forest*)malloc(sizeof(Forest));
forest->trees = (TreeNode**)malloc(sizeof(TreeNode*) * treeCount);
forest->count = treeCount;
return forest;
}
// 示例:创建3.3.5要求的树(10个节点)
TreeNode* createExampleTree() {
// 创建节点
TreeNode* root = createNode(1);
TreeNode* node2 = createNode(2);
TreeNode* node3 = createNode(3);
TreeNode* node4 = createNode(4);
TreeNode* node5 = createNode(5);
TreeNode* node6 = createNode(6);
TreeNode* node7 = createNode(7);
TreeNode* node8 = createNode(8);
TreeNode* node9 = createNode(9);
TreeNode* node10 = createNode(10);
// 构建树结构:
// 1
// / | \
// 2 3 4
// /| | |\
// 5 6 7 8 9
// |
// 10
addChild(root, node2);
addChild(root, node3);
addChild(root, node4);
addChild(node2, node5);
addChild(node2, node6);
addChild(node3, node7);
addChild(node4, node8);
addChild(node4, node9);
addChild(node6, node10);
return root;
}
// 示例:创建3.3.6要求的森林(3棵树)
Forest* createExampleForest() {
Forest* forest = createForest(3);
// 第一棵树
TreeNode* tree1 = createNode(1);
TreeNode* node2 = createNode(2);
TreeNode* node3 = createNode(3);
addChild(tree1, node2);
addChild(tree1, node3);
// 第二棵树
TreeNode* tree2 = createNode(4);
TreeNode* node5 = createNode(5);
TreeNode* node6 = createNode(6);
TreeNode* node7 = createNode(7);
addChild(tree2, node5);
addChild(node5, node6);
addChild(node5, node7);
// 第三棵树
TreeNode* tree3 = createNode(8);
TreeNode* node9 = createNode(9);
TreeNode* node10 = createNode(10);
addChild(tree3, node9);
addChild(tree3, node10);
forest->trees[0] = tree1;
forest->trees[1] = tree2;
forest->trees[2] = tree3;
return forest;
}
int main() {
printf("=== 3.3.4 孩子兄弟表示法示例 ===\n");
printf("\n3.3.5 单棵树示例(10个节点):\n");
TreeNode* tree = createExampleTree();
printTree(tree, 0);
printf("\n3.3.6 森林示例(3棵树):\n");
Forest* forest = createExampleForest();
for (int i = 0; i < forest->count; i++) {
printf("第%d棵树:\n", i + 1);
printTree(forest->trees[i], 0);
printf("\n");
}
return 0;
}