使用C语言编写程序实现下列要求并给出测试结果。a.输入根据用户的输入信息,建立二叉树的二叉列表。 b.利用递归和非递归实现二叉树的中序遍历,利用队列实现二叉树的层次遍历。 c.求所有叶子结点总数。 d.求该二叉树的高度。
时间: 2024-11-25 07:17:58 浏览: 42
在C语言中,我们可以使用结构体定义二叉树节点,并通过指针连接形成二叉链表。以下是基本的步骤:
1. 定义二叉树节点:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
2. 输入二叉树构建函数 (非递归):
```c
TreeNode* buildTree(int input[], int start, int end) {
if (start > end) return NULL; // 根据输入数组创建节点
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = input[start];
int mid = (start + end) / 2;
root->left = buildTree(input, start, mid - 1);
root->right = buildTree(input, mid, end);
return root;
}
```
3. 中序遍历(递归和非递归):
- **递归**:
```c
void inorderTraversal(TreeNode* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->val); // 输出节点值
inorderTraversal(root->right);
}
}
```
- **非递归(利用栈)**:
```c
void inorderTraversalNonRecursive(TreeNode* root, int stack[], int top) {
while (root || top >= 0) {
if (root) {
stack[top++] = root;
root = root->left;
} else {
root = stack[--top]; // 出栈节点,右子节点遍历
printf("%d ", root->val);
root = root->right;
}
}
}
```
4. 层次遍历(利用队列):
```c
void levelOrderTraversal(TreeNode* root) {
if (!root) return;
Queue q;
q.enqueue(root);
while (!q.isEmpty()) {
TreeNode* node = q.dequeue();
printf("%d ", node->val); // 输出节点值
if (node->left) q.enqueue(node->left);
if (node->right) q.enqueue(node->right);
}
}
```
5. 计算叶子节点数:
```c
int countLeaves(TreeNode* root) {
if (!root) return 0;
if (!root->left && !root->right) return 1; // 叶子节点直接返回1
return countLeaves(root->left) + countLeaves(root->right);
}
```
6. 求二叉树高度:
```c
int height(TreeNode* root) {
if (!root) return 0;
int left_height = height(root->left);
int right_height = height(root->right);
return (left_height > right_height ? left_height : right_height) + 1;
}
```
为了测试以上功能,你需要先输入一组整数作为二叉树的构造序列,然后分别调用这些函数打印结果。注意每个函数都假设已经成功创建了二叉树。在实际应用中,你需要处理用户输入、内存分配错误等边界情况。
阅读全文
相关推荐













