数据结构树

xiaoxiao2021-02-28  134

树(tree)是包含n(n>0)个结点的有穷集,其中: (1)每个元素称为结点(node); (2)有一个特定的结点被称为根结点或树根(root)。 (3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。 树也可以这样定义:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。 以下为树的基本操作: #ifndef __TREE_H__ #define __TREE_H__ #include "error.h" struct _treeNode; // 孩子结点链表的类型 typedef struct _childNode { struct _treeNode * childNode; struct _childNode *next; // 指向孩子结点链表下一个元素 }ChildNode; // 树节点类型 typedef char TreeData; typedef struct _treeNode { TreeData data; struct _treeNode *parent; // 指向父节点的指针 struct _treeNode *next; // 指向链表的下一个结点 struct _childNode *childList; // 孩子链表的头节点 int degree; // 结点的度 }TreeNode; typedef struct _tree { struct _treeNode *head; // 树链表的头节点 int len; // 树结点个数 }Tree; Tree *Create_Tree(); // pos 代表要插入结点父亲结点的位置 // 约定: // 1 新插入的结点插入在当前父亲结点所有孩子的右边 // 2 根节点的位置是 0 int Insert_Tree(Tree *tree, TreeData data, int pos); #endif // __TREE_H__ #include "tree.h" #include <stdlib.h> Tree *Create_Tree() { // 创建树节点 Tree* tree = (Tree*)malloc(sizeof(Tree)/sizeof(char)); if (tree == NULL) { errno = MALLOC_ERROR; return NULL; } // 给树结点链表创建头节点 tree->head = (TreeNode*)malloc(sizeof(TreeNode)/sizeof(char)); if (tree->head == NULL) { errno = MALLOC_ERROR; free (tree); return NULL; } tree->head->parent = NULL; tree->head->childList = NULL; tree->head->next = NULL; // 代表树中没有结点 // 空树结点为0 tree->len = 0; return tree; } /* TreeData data; struct _treeNode *parent; // 指向父节点的指针 11111111111 struct _treeNode *next; // 指向链表的下一个结点 struct _childNode *childList; // 孩子链表的头节点 int degree; // 结点的度 typedef struct _childNode { struct _treeNode * childNode; struct _childNode *next; // 指向孩子结点链表下一个元素 }ChildNode; */ int Insert_Tree(Tree *tree, TreeData data, int pos) { if (tree == NULL || pos < 0 || pos >= tree->len) { errno = ERROR; return FALSE; } // 新建结点 TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)/sizeof(char)); if (node == NULL) { errno = MALLOC_ERROR; return FALSE; } node->data = data; node->next = NULL; // 创建该新节点的孩子结点链表的头节点 node->childList = (ChildNode*)malloc(sizeof(ChildNode)/sizeof(char)); if (node->childList == NULL) { errno = MALLOC_ERROR; free (node); return FALSE; } node->childList->next = NULL; node->childList->childNode = NULL; node->degree = 0; int i; // 找父节点 TreeNode* parent = tree->head->next; // 当前树节点的第一个结点 for (i = 0; i < pos; i++) { parent = parent->next; } node->parent = parent; // 在父亲结点的子结点链表中加入一个结点 if (parent != NULL) { // 创建一个孩子结点 ChildNode* childnode = (ChildNode*)malloc(sizeof(ChildNode)/sizeof(char)); if (childnode == NULL) { errno = MALLOC_ERROR; free(node->childList); free (node); return FALSE; } childnode->childNode = node; childnode->next = NULL; // 加入到父亲结点子结点链表当中 ChildNode* tmp = parent->childList; // 子结点链表的头节点 while (tmp->next) tmp = tmp->next; tmp->next = childnode; parent->degree += 1; } TreeNode* tmp = tree->head; // 树节点链表的头节点 while (tmp->next) tmp = tmp->next; tmp->next = node; tree->len += 1; return TRUE; } #include <stdio.h> #include "tree.h" int main() { Tree *tree = Create_Tree(); if (tree == NULL) { myError("Create_Tree"); return -1; } Insert_Tree(tree, 'A', 0); Insert_Tree(tree, 'B', 0); Insert_Tree(tree, 'C', 0); Insert_Tree(tree, 'D', 0); Insert_Tree(tree, 'E', 1); Insert_Tree(tree, 'F', 1); Insert_Tree(tree, 'H', 3); Insert_Tree(tree, 'I', 3); Insert_Tree(tree, 'J', 3); display(tree); return 0; }
转载请注明原文地址: https://www.6miu.com/read-25991.html

最新回复(0)