树的相关概念代码
编译环境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;
}