编写一个经典C语言数据结构-树
时间: 2023-08-31 07:24:44 浏览: 101
### 回答1:
树(Tree)是一种非线性的数据结构,它由n(n>=0)个结点构成,其中一个结点为根结点,其余结点可分为m(m>=0)个互不相交的子集T1、T2、……、Tm,其中每一个子集本身又是一棵树,并称为根的子树。树的特点是:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点之外,每个子结点可以分为多个不相交的子树。
下面是一个基本的树的结构定义:
```c
// 树的结构体定义
typedef struct TreeNode
{
int data; // 数据域
struct TreeNode *firstChild;// 第一个子节点
struct TreeNode *nextSibling;// 兄弟节点
}TreeNode, *Tree;
```
其中,data表示结点的数据域,firstChild指向该结点的第一个子节点,nextSibling指向该结点的下一个兄弟节点。
下面是一个创建树的函数:
```c
// 创建树
Tree createTree(int data)
{
Tree root = (Tree)malloc(sizeof(TreeNode));
root->data = data;
root->firstChild = NULL;
root->nextSibling = NULL;
return root;
}
```
下面是一个向树中添加子节点的函数:
```c
// 添加子节点
void addChild(Tree parent, int data)
{
Tree child = (Tree)malloc(sizeof(TreeNode));
child->data = data;
child->firstChild = NULL;
child->nextSibling = NULL;
if (parent->firstChild == NULL)
parent->firstChild = child;
else
{
Tree p = parent->firstChild;
while (p->nextSibling != NULL)
p = p->nextSibling;
p->nextSibling = child;
}
}
```
下面是一个先序遍历树的函数:
```c
// 先序遍历树
void preOrderTraversal(Tree root)
{
if (root != NULL)
{
printf("%d ", root->data);
preOrderTraversal(root->firstChild);
preOrderTraversal(root->nextSibling);
}
}
```
下面是一个后序遍历树的函数:
```c
// 后序遍历树
void postOrderTraversal(Tree root)
{
if (root != NULL)
{
postOrderTraversal(root->firstChild);
postOrderTraversal(root->nextSibling);
printf("%d ", root->data);
}
}
```
下面是一个层次遍历树的函数:
```c
// 层次遍历树
void levelOrderTraversal(Tree root)
{
Queue q;
initQueue(&q);
if (root != NULL)
{
enQueue(&q, root);
while (!isQueueEmpty(&q))
{
Tree p = deQueue(&q);
printf("%d ", p->data);
if (p->firstChild != NULL)
enQueue(&q, p->firstChild);
if (p->nextSibling != NULL)
enQueue(&q, p->nextSibling);
}
}
}
```
其中,Queue是一个队列结构体。
以上就是一个简单的树的实现。
### 回答2:
树是一种常见的数据结构,用于存储具有层次关系的数据。它由节点和边组成,通常包含一个根节点和若干子节点。
在C语言中,我们可以使用结构体来定义树的节点。一个最基本的树节点结构体可能包含两个成员变量:数据和指向子节点的指针。例如:
```
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
上述代码定义了一个名为TreeNode的结构体,它包含一个整型数据成员和两个指向左子节点和右子节点的指针。
为了方便操作树,我们可以定义一些基本的函数。其中,创建节点的函数可以使用动态内存分配来分配新节点的内存空间。例如:
```
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
```
我们还可以定义插入节点、删除节点、搜索节点等函数来操作树的结构。
除此之外,还可以实现一些遍历树的算法,如先序遍历、中序遍历和后序遍历。这些遍历方法可以递归地遍历树的节点,并对节点进行指定的操作。
编写树的操作函数时,需要考虑到不同树的特点,例如二叉搜索树要保持左子节点的值小于根节点,右子节点的值大于根节点。
总之,编写一个经典C语言数据结构-树需要定义树节点的结构体,实现节点的创建、插入、删除和搜索等操作函数,同时可以实现遍历树的算法。
### 回答3:
树是一种经典的数据结构,C语言可以很方便地实现树的相关操作。首先,我们可以定义一个树的节点结构体:
```c
typedef struct Node {
int data; // 节点存储的数据
struct Node* left; // 左子树指针
struct Node* right; // 右子树指针
} Node;
```
接下来,我们可以实现一些树的基本操作,例如创建树、插入节点、删除节点和遍历。下面是一个简单的示例:
```c
// 创建一个节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 在树中插入一个节点
Node* insertNode(Node* root, int data) {
if (root == NULL) {
return createNode(data);
} else if (data < root->data) {
root->left = insertNode(root->left, data);
} else if (data > root->data) {
root->right = insertNode(root->right, data);
}
return root;
}
// 在树中删除一个节点
Node* deleteNode(Node* root, int data) {
if (root == NULL) {
return root;
} else if (data < root->data) {
root->left = deleteNode(root->left, data);
} else if (data > root->data) {
root->right = deleteNode(root->right, data);
} else {
if (root->left == NULL) {
Node* temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
Node* temp = root->left;
free(root);
return temp;
}
Node* temp = findMinNode(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
// 遍历树:前序遍历(中-左-右)
void preOrderTraversal(Node* root) {
if (root != NULL) {
printf("%d ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
```
这只是树的基本实现,树还有很多其他操作,例如查找节点、判断树是否为空、计算树的高度等。可以根据具体需求进行扩展。通过以上实现,我们可以使用经典的C语言来构建和操作树结构。
阅读全文