输入先序遍历字符序列,建立二叉链表。 2.按先序、中序和后序遍历二叉树,输出所有的结点(递归算法)。 3.求二叉树的结点个数。 4.输出二叉树的叶子结点。 5.求二叉树的高度。 6.在主函数中设计一个简单的菜单,分别调试上述算法..c语言编写
时间: 2024-02-15 20:05:50 浏览: 130
(1)二叉树的建立 (2)求出二叉树的高度 (3)求出二叉树结点个数 (4)先序遍历递归实现 (5)先序遍历非递归实现 (6)求出二叉树叶子结点个数
3星 · 编辑精心推荐
好的,以下是完整的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 根据先序遍历字符序列建立二叉链表
TreeNode* createTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = ch;
root->left = createTree();
root->right = createTree();
return root;
}
// 先序遍历输出二叉树中所有结点
void preOrder(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历输出二叉树中所有结点
void inOrder(TreeNode *root) {
if (root == NULL) {
return;
}
inOrder(root->left);
printf("%c ", root->data);
inOrder(root->right);
}
// 后序遍历输出二叉树中所有结点
void postOrder(TreeNode *root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}
// 计算二叉树的结点个数
int getNodeCount(TreeNode *root) {
if (root == NULL) {
return 0;
}
return getNodeCount(root->left) + getNodeCount(root->right) + 1;
}
// 输出二叉树中所有叶子结点
void printLeaves(TreeNode *root) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
printf("%c ", root->data);
}
printLeaves(root->left);
printLeaves(root->right);
}
// 计算二叉树的高度
int getHeight(TreeNode *root) {
if (root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
}
int main() {
TreeNode *root = createTree();
int choice;
do {
printf("\n");
printf("1. 先序遍历输出二叉树中所有结点\n");
printf("2. 中序遍历输出二叉树中所有结点\n");
printf("3. 后序遍历输出二叉树中所有结点\n");
printf("4. 计算二叉树的结点个数\n");
printf("5. 输出二叉树中所有叶子结点\n");
printf("6. 计算二叉树的高度\n");
printf("0. 退出程序\n");
printf("请输入要执行的操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
preOrder(root);
break;
case 2:
inOrder(root);
break;
case 3:
postOrder(root);
break;
case 4:
printf("二叉树的结点个数为:%d\n", getNodeCount(root));
break;
case 5:
printf("二叉树中所有叶子结点为:");
printLeaves(root);
printf("\n");
break;
case 6:
printf("二叉树的高度为:%d\n", getHeight(root));
break;
case 0:
printf("程序已退出。\n");
break;
default:
printf("无效的操作。\n");
break;
}
} while (choice != 0);
return 0;
}
```
其中,`createTree()`函数根据先序遍历字符序列建立二叉链表,`preOrder()`、`inOrder()`和`postOrder()`函数分别按先序、中序和后序遍历二叉树并输出所有的结点,`getNodeCount()`函数计算二叉树的结点个数,`printLeaves()`函数输出二叉树的所有叶子结点,`getHeight()`函数计算二叉树的高度。在主函数中,我们设计了一个简单的菜单,使用者可以选择要执行的操作,直到选择退出程序为止。
阅读全文