创建一颗二叉树,计算二叉树结点个数,叶子结点个数,二叉树深度,复制二叉树并将其以前序遍历,中序遍历,后序遍历进行输出,使用c语言来编写
时间: 2024-11-21 15:21:03 浏览: 21
创建一颗二叉树的基本步骤通常是递归地定义节点结构,并通过指针连接左孩子和右孩子。以下是使用C语言创建二叉树、计算节点个数、叶子结点个数、深度以及复制二叉树并进行前序、中序、后序遍历的基本框架:
首先,定义一个简单的二叉树节点结构:
```c
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} TreeNode;
```
接下来,创建二叉树函数示例:
```c
// 插入节点创建二叉树
TreeNode* createTree(int arr[], int start, int end) {
if (start > end)
return NULL;
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = arr[start];
root->left = NULL;
root->right = NULL;
int mid = (start + end) / 2;
root->left = createTree(arr, start, mid - 1);
root->right = createTree(arr, mid, end);
return root;
}
// 计算节点总数
int countNodes(TreeNode* root) {
if (root == NULL)
return 0;
else
return 1 + countNodes(root->left) + countNodes(root->right);
}
```
叶子结点个数可以通过递归找到每个非空节点的左右子树是否为空来计算:
```c
int countLeaves(TreeNode* root) {
if (root == NULL)
return 0;
else if (root->left == NULL && root->right == NULL)
return 1;
else
return countLeaves(root->left) + countLeaves(root->right);
}
```
深度可以使用递归来计算:
```c
int depth(TreeNode* root) {
if (root == NULL)
return 0;
else
return 1 + max(depth(root->left), depth(root->right));
}
int max(int a, int b) { return a > b ? a : b; }
```
复制二叉树可以使用递归,将源树的节点替换为新节点:
```c
TreeNode* copyTree(TreeNode* src) {
if (src == NULL)
return NULL;
TreeNode* dst = (TreeNode*)malloc(sizeof(TreeNode));
dst->val = src->val;
dst->left = copyTree(src->left);
dst->right = copyTree(src->right);
return dst;
}
```
最后,分别实现前序、中序和后序遍历:
```c
void preOrder(TreeNode* root, void (*print)(int)) {
if (root != NULL) {
print(root->val); // 输出当前节点
preOrder(root->left, print);
preOrder(root->right, print);
}
}
void inOrder(TreeNode* root, void (*print)(int)) {
if (root != NULL) {
inOrder(root->left, print);
print(root->val);
inOrder(root->right, print);
}
}
void postOrder(TreeNode* root, void (*print)(int)) {
if (root != NULL) {
postOrder(root->left, print);
postOrder(root->right, print);
print(root->val);
}
}
```
阅读全文