使用c语言 采用二叉链表存储二叉树,并对二叉树进行如下操作:建立一棵二叉树;三种方式遍 历二叉树;求二叉树的深度;输出二叉树所有结点的个数;输出二叉树所有叶子结点的个 数。 要求写出各个算法相应的实现程序。
时间: 2024-11-03 10:08:39 浏览: 64
在C语言中,我们可以使用结构体来表示二叉树节点,然后通过指针相连形成二叉链表。以下是实现一些基本操作的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建新的二叉树节点
TreeNode* createNode(int val) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入节点到二叉链表中
TreeNode* insertNode(TreeNode** root, int val) {
if (*root == NULL) {
*root = createNode(val);
} else if (val < (*root)->val) {
(*root)->left = insertNode(&(*root)->left, val);
} else {
(*root)->right = insertNode(&(*root)->right, val);
}
return *root;
}
// 三种遍历方式
// 前序遍历(根-左-右)
void preOrderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 先访问根节点
preOrderTraversal(root->left); // 再遍历左子树
preOrderTraversal(root->right); // 最后遍历右子树
}
}
// 中序遍历(左-根-右)
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left);
printf("%d ", root->val);
inOrderTraversal(root->right);
}
}
// 后序遍历(左-右-根)
void postOrderTraversal(TreeNode* root) {
if (root != NULL) {
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->val);
}
}
// 求二叉树的深度
int maxDepth(TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(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 countLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1; // 叶子节点判断
return countLeaves(root->left) + countLeaves(root->right);
}
// 主函数演示上述功能
int main() {
TreeNode* root = NULL;
// 假设已经插入了一些节点...
// 遍历
printf("前序遍历结果: ");
preOrderTraversal(root);
printf("\n");
printf("中序遍历结果: ");
inOrderTraversal(root);
printf("\n");
printf("后序遍历结果: ");
postOrderTraversal(root);
printf("\n");
printf("最大深度: %d\n", maxDepth(root));
printf("节点总数: %d\n", countNodes(root));
printf("叶子节点总数: %d\n", countLeaves(root));
return 0;
}
```
请注意,这只是一个基础的实现,实际应用中还需要处理内存分配和释放,以及异常情况等。
阅读全文