用C语言写一个二叉树的基本操作的完整代码要求(1)创建链式存储的二叉树,用户输入字符串,程序按照先序遍历的顺序遍历字符串并建立对应结构的二叉树,参考算法5.3。(2)二叉链表的三种遍历方法:前序遍历、中序遍历、后序遍历,参考算法5.1。(3)计算给定二叉树的深度、结点个数。
时间: 2024-11-30 16:14:19 浏览: 57
在C语言中,我们可以使用结构体来表示二叉树节点,并使用指针连接它们。首先,我们需要定义一个`TreeNode`结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义二叉树节点
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建一个新的节点
TreeNode* createNode(char data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode-右)
void preorderTraversal(TreeNode* node) {
if (node != NULL) {
printf("%c ", node->data);
preorderTraversal(node->left);
preorderTraversal(node->right);
}
}
// 中序遍历(左-根-右)
void inorderTraversal(TreeNode* node) {
if (node != NULL) {
inorderTraversal(node->left);
printf("%c ", node->data);
inorderTraversal(node->right);
}
}
// 后序遍历(左-右-根)
void postorderTraversal(TreeNode* node) {
if (node != NULL) {
postorderTraversal(node->left);
postorderTraversal(node->right);
printf("%c ", node->data);
}
}
// 计算二叉树深度
int calculateDepth(TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = calculateDepth(root->left);
int rightDepth = calculateDepth(root->right);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
// 计算二叉树节点总数
int countNodes(TreeNode* root) {
if (root == NULL) return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
// 主函数,用户输入字符串构建二叉树
int main() {
char input[100];
printf("请输入字符串:");
fgets(input, sizeof(input), stdin); // 注意这里要移除最后的换行符
input[strlen(input) - 1] = '\0'; // 删除末尾换行符
TreeNode* root = createNode(input[0]);
for (int i = 1; input[i]; i++) {
TreeNode* currentNode = root;
while (currentNode != NULL && strcmp(&input[i], currentNode->data) != 0) {
if (strcmp(&input[i], currentNode->left->data) < 0)
currentNode = currentNode->left;
else
currentNode = currentNode->right;
}
if (strcmp(&input[i], currentNode->data) == 0)
break;
TreeNode* newNode = createNode(input[i]);
if (strcmp(&input[i], currentNode->data) < 0)
currentNode->left = newNode;
else
currentNode->right = newNode;
}
printf("先序遍历结果:\n");
preorderTraversal(root);
printf("\n中序遍历结果:\n");
inorderTraversal(root);
printf("\n后序遍历结果:\n");
postorderTraversal(root);
printf("\n树的深度:%d\n", calculateDepth(root));
printf("树的节点总数:%d\n", countNodes(root));
return 0;
}
```
阅读全文