请求帮助编写C语言程序,包括但不限于以下几个任务:1. 设计并实现一个二叉树结构;2. 计算给定二叉树的深度和叶子节点数量;3. 实现二叉树的副本(复制)功能;4. 完成二叉树的左子树与右子树的交换操作。请提供每个步骤的具体需求和输入输出示例,以便于我了解细节并生成相应的代码。
时间: 2024-12-13 17:19:31 浏览: 14
好的,下面是针对每个任务的一个简要说明以及示例代码片段,你可以根据这些指导继续编写完整的程序。
**1. 二叉树结构设计:**
```c
// 定义二叉树节点
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建一个新节点
TreeNode* newNode(int data) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = data;
node->left = NULL;
node->right = NULL;
return node;
}
```
**2. 深度和叶节点数量计算:**
```c
// 计算深度
int maxDepth(TreeNode* root) {
if (root == NULL) return 0;
return 1 + MAX(maxDepth(root->left), maxDepth(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);
}
```
假设输入树 `1 -> 2 -> 3 -> NULL` ,输出结果为深度6,叶节点数量2。
**3. 二叉树复制(深拷贝):**
```c
// 深度复制
TreeNode* cloneTree(TreeNode* root) {
if (root == NULL) return NULL;
return newNode(root->val); // 如果根节点为空,直接返回空指针
TreeNode* leftCopy = cloneTree(root->left);
TreeNode* rightCopy = cloneTree(root->right);
return newNode(root->val, leftCopy, rightCopy);
}
```
**4. 左右子树交换:**
```c
// 交换左右子树
void swapChildren(TreeNode* node) {
if (node != NULL) {
TreeNode* temp = node->left;
node->left = node->right;
node->right = temp;
}
}
```
以上代码片段仅为基本实现,实际编程时需要考虑错误处理和内存管理。记得在主函数中调用这些函数,并输入适当的树结构作为参数。例如,创建树结构可以手动,也可以通过用户输入或文件读取。
阅读全文