C语言中关于树和二叉树的相关概念
树的概念
在计算机科学中,树是一种非常常见的数据结构,它由一组节点(通常称为元素)和一组连接节点的边组成。树是一种无向的、连通的、无环的图形结构,其中有一个节点被称为根节点,它没有父节点,而其他节点都有一个父节点。
树的定义很抽象,但在程序设计中,我们通常会使用一个节点类来实现树结构。一个节点类通常包含两个元素:一个是表示当前节点的值的数据成员(通常称为key或value),另一个是指向该节点的子节点列表的指针(通常称为children)。
二叉树的概念
二叉树是一种特殊的树结构,它是一种每个节点最多只有两个子节点的树形结构。二叉树具有一些非常常见的特性,例如左子树和右子树的区别、深度优先遍历和广度优先遍历等。在程序设计中,我们通常使用一个节点类来实现二叉树结构,每个节点类包含三个元素:表示当前节点的值的数据成员、指向左子节点的指针和指向右子节点的指针。
二叉树有两种常见的遍历方法:深度优先遍历和广度优先遍历。深度优先遍历是一种递归的遍历方法,遍历完左子树后再遍历右子树。广度优先遍历是一种迭代的遍历方法,也称作层次遍历。我们通常使用一个队列来实现广度优先遍历。
示例
下面是一个用C语言实现的二叉树的示例代码,展示了树和二叉树结构的一些常见操作:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 初始化一个节点
struct TreeNode *createNode(int val) {
struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入一个节点到树中
void insert(struct TreeNode **root, int val) {
if (*root == NULL) {
*root = createNode(val);
return;
}
if ((*root)->val > val) {
insert(&((*root)->left), val);
} else {
insert(&((*root)->right), val);
}
}
// 先序遍历
void preOrderTraversal(struct TreeNode *root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历
void inOrderTraversal(struct TreeNode *root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
printf("%d ", root->val);
inOrderTraversal(root->right);
}
// 后序遍历
void postOrderTraversal(struct TreeNode *root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->val);
}
// 广度优先遍历
void levelOrderTraversal(struct TreeNode *root) {
if (root == NULL) {
return;
}
struct TreeNode *queue[1000];
int front = 0, rear = 0;
queue[rear++] = root;
while (front != rear) {
struct TreeNode *node = queue[front++];
printf("%d ", node->val);
if (node->left != NULL) {
queue[rear++] = node->left;
}
if (node->right != NULL) {
queue[rear++] = node->right;
}
}
}
int main() {
struct TreeNode *root = NULL;
insert(&root, 5);
insert(&root, 2);
insert(&root, 8);
insert(&root, 1);
insert(&root, 3);
printf("preorder: ");
preOrderTraversal(root);
printf("\n");
printf("inorder: ");
inOrderTraversal(root);
printf("\n");
printf("postorder: ");
postOrderTraversal(root);
printf("\n");
printf("levelorder: ");
levelOrderTraversal(root);
printf("\n");
return 0;
}
这里我们定义了一个节点结构体TreeNode,包含节点的值val和左右子节点left和right。然后我们定义了createNode函数来初始化一个节点,insert函数插入一个节点,preOrderTraversal、inOrderTraversal和postOrderTraversal函数分别实现二叉树的深度优先遍历,levelOrderTraversal函数实现二叉树的广度优先遍历。最后我们在主函数中创建了一个二叉树并遍历输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中关于树和二叉树的相关概念 - Python技术站