王道应用题强化打卡3.3.4-3.3.6

#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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值