使用C语言编写程序实现a.输入根据用户的输入信息,建立二叉树的二叉列表。并给出示例。 b.利用递归和非递归实现二叉树的中序遍历,利用队列实现二叉树的层次遍历。 c.求所有叶子结点总数。 d.求该二叉树的高度。
时间: 2024-11-25 11:17:32 浏览: 30
在C语言中,我们可以使用结构体来表示二叉树节点,并通过用户输入构建二叉树。这里提供一些基本的步骤和示例:
a. 建立二叉树的二叉链表示例:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
void insertIntoBST(TreeNode** root, int val) {
if (*root == NULL) {
*root = (TreeNode*)malloc(sizeof(TreeNode));
(*root)->val = val;
(*root)->left = NULL;
(*root)->right = NULL;
} else if (val < (*root)->val) {
insertIntoBST(&(*root)->left, val);
} else {
insertIntoBST(&(*root)->right, val);
}
}
```
用户可以根据需求调用`insertIntoBST`函数,输入值来构建二叉树。
b. 二叉树遍历:
- 中序遍历(递归和非递归):
- 递归:
```c
void inorderTraversalRec(TreeNode* root) {
if (root != NULL) {
inorderTraversalRec(root->left);
printf("%d ", root->val);
inorderTraversalRec(root->right);
}
}
```
- 非递归(使用栈):
```c
void inorderTraversalNonRec(TreeNode* root, stack_t* s) {
while (root || !is_empty(s)) {
while (root) {
push(s, root);
root = root->left;
}
root = pop(s);
printf("%d ", root->val);
root = root->right;
}
}
```
- 层次遍历(利用队列):
```c
void levelOrderTraversal(TreeNode* root) {
if (!root) return;
queue_t q;
enqueue(q, root);
while (!is_empty(q)) {
TreeNode* node = dequeue(q);
printf("%d ", node->val);
if (node->left) enqueue(q, node->left);
if (node->right) enqueue(q, node->right);
}
}
```
c. 求所有叶子节点总数:
```c
int countLeaves(TreeNode* root) {
if (!root) return 0;
if (!root->left && !root->right) return 1; // 判断是否是叶子节点
return countLeaves(root->left) + countLeaves(root->right);
}
```
d. 求二叉树的高度:
```c
int heightOfTree(TreeNode* root) {
if (!root) return 0;
int leftHeight = heightOfTree(root->left);
int rightHeight = heightOfTree(root->right);
return MAX(leftHeight, rightHeight) + 1; // 返回较大一侧的高度加1
}
```
以上代码中,`stack_t`、`queue_t`和`is_empty()`等函数需自定义实现堆栈和队列的数据结构以及判断空栈/空队列的操作。
阅读全文