【基础数据结构】树

树的相关概念代码

编译环境Dev-cpp(C++) 

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode {
    struct TreeNode* data;  // 指向树节点的指针
    struct ListNode* next;  // 指向下一个链表节点的指针
} ListNode;

typedef struct TreeNode {
    char data;  // 节点的数据
    ListNode* childrenHead;  // 指向子节点链表的头指针
} TreeNode;

typedef struct Tree {
    TreeNode* nodes;  // 树节点数组
    TreeNode* root;  // 树的根节点
    int maxNodes;  // 最大节点数量
} Tree;

ListNode* createListNode(TreeNode* treeNode) {
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));  // 分配链表节点的内存
    newNode->data = treeNode;
    newNode->next = NULL;
    return newNode;
}

TreeNode* createTreeNode(char data) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));  // 分配树节点的内存
    newNode->data = data;
    newNode->childrenHead = NULL;
    return newNode;
}

Tree* createTree(int maxNodes) {
    Tree* newTree = (Tree*)malloc(sizeof(Tree));  // 分配树的内存
    newTree->nodes = (TreeNode*)malloc(sizeof(TreeNode) * maxNodes);  // 分配节点数组的内存
    newTree->root = NULL;
    newTree->maxNodes = maxNodes;
    return newTree;
}

void setRoot(Tree* tree, int id) {
    tree->root = &(tree->nodes[id]);  // 设置树的根节点
}

void addChild(Tree* tree, int parentId, int sonId) {
    TreeNode* parentNode = &(tree->nodes[parentId]);  // 父节点
    TreeNode* sonNode = &(tree->nodes[sonId]);  // 子节点
    ListNode* childNode = createListNode(sonNode);  // 创建子节点链表节点

    if (parentNode->childrenHead == NULL) {
        parentNode->childrenHead = childNode;  // 链表为空时,直接作为头节点
    } else {
        childNode->next = parentNode->childrenHead;  // 将新节点插入链表头部
        parentNode->childrenHead = childNode;  // 更新链表头指针
    }
}

void assignData(Tree* tree, int id, char data) {
    tree->nodes[id].data = data;  // 为给定节点分配数据
}

void print(TreeNode* node) {
    if (node == NULL) {
        return;
    }

    printf("%c ", node->data);  // 打印节点数据

    ListNode* tmp = node->childrenHead;
    while (tmp != NULL) {
        print(tmp->data);  // 递归打印子节点
        tmp = tmp->next;
    }
}

void treePrint(Tree* tree) {
    if (tree == NULL || tree->root == NULL) {
        return;
    }

    print(tree->root);  // 从根节点开始打印树的结构
    printf("\n");
}

void destroyList(ListNode* node) {
    if (node == NULL) {
        return;
    }

    destroyList(node->next);  // 递归销毁链表节点
    free(node);
}

void destroyTree(Tree* tree) {
    if (tree == NULL) {
        return;
    }

    free(tree->nodes);  // 释放节点数组内存
    destroyList(tree->root->childrenHead);  // 销毁子节点链表
    free(tree);  // 释放树的内存
}

int main() {
    Tree* T = createTree(9);  // 创建一个能容纳9个节点的树
    setRoot(T, 0);  // 设置根节点为0号节点
    assignData(T, 0, 'a');  // 分配每个节点的数据
    assignData(T, 1, 'b');
    assignData(T, 2, 'c');
    assignData(T, 3, 'd');
    assignData(T, 4, 'e');
    assignData(T, 5, 'f');
    assignData(T, 6, 'g');
    assignData(T, 7, 'h');
    assignData(T, 8, 'i');

    addChild(T, 0, 2);  // 将节点连接起来形成树的结构
    addChild(T, 0, 1);
    addChild(T, 1, 3);
    addChild(T, 2, 5);
    addChild(T, 2, 4);
    addChild(T, 3, 8);
    addChild(T, 3, 7);
    addChild(T, 3, 6);

    treePrint(T);  // 打印整个树的结构
    destroyTree(T);  // 销毁树的内存

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polaris北极星少女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值