用C语言实现,完成二叉树二叉链表结构的定义(包括树的定义和结点的定义)实现二叉链表创建二叉树(尝试用递归算法实现),并实现先序、中序和后序遍历算法,实现二叉树求结点个数,求树的高度,求叶子结点数、交换二叉树左右子树的算法,并给出主函数,主函数中要包含通过switch语句创建菜单调用这几个算法的函数
时间: 2023-06-06 11:06:32 浏览: 117
这是基本数据结构及其算法的C++实现,涉及单链表、双链表、栈 、二叉树、并查集、哈夫曼树、平衡二叉树、二叉搜索树等.zip
您好,这是一个关于编程的问题,属于技术领域,我可以为您提供答案。以下是对您的问题的回答:
二叉树的定义:
```
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
```
其中,`data` 表示结点的数据,`lchild` 和 `rchild` 分别表示左子树和右子树。
二叉树的创建:
```
BiTree create_tree() {
BiTNode *p;
int d;
scanf("%d", &d);
if (d == 0) {
return NULL;
}
else {
p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = d;
p->lchild = create_tree(); // 递归创建左子树
p->rchild = create_tree(); // 递归创建右子树
return p;
}
}
```
先序遍历:
```
void pre_order(BiTree T) {
if (T) {
printf("%d ", T->data);
pre_order(T->lchild);
pre_order(T->rchild);
}
}
```
中序遍历:
```
void in_order(BiTree T) {
if (T) {
in_order(T->lchild);
printf("%d ", T->data);
in_order(T->rchild);
}
}
```
后序遍历:
```
void post_order(BiTree T) {
if (T) {
post_order(T->lchild);
post_order(T->rchild);
printf("%d ", T->data);
}
}
```
二叉树的结点个数:
```
int node_count(BiTree T) {
if (T == NULL) {
return 0;
}
else {
return node_count(T->lchild) + node_count(T->rchild) + 1;
}
}
```
二叉树的高度:
```
int tree_height(BiTree T) {
if (T == NULL) {
return 0;
}
int left_height = tree_height(T->lchild);
int right_height = tree_height(T->rchild);
return left_height > right_height ? left_height + 1 : right_height + 1;
}
```
二叉树的叶子结点数:
```
int leaf_count(BiTree T) {
if (T == NULL) {
return 0;
}
else if (T->lchild == NULL && T->rchild == NULL) {
return 1;
}
else {
return leaf_count(T->lchild) + leaf_count(T->rchild);
}
}
```
交换二叉树左右子树:
```
void invert_tree(BiTree T) {
if (T == NULL) {
return;
}
BiTNode *temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
invert_tree(T->lchild);
invert_tree(T->rchild);
}
```
主函数(包含菜单):
```
int main() {
BiTree T = NULL;
int choice;
do {
printf("请选择菜单:\n");
printf("1. 创建二叉树\n");
printf("2. 先序遍历\n");
printf("3. 中序遍历\n");
printf("4. 后序遍历\n");
printf("5. 结点个数\n");
printf("6. 树的高度\n");
printf("7. 叶子结点数\n");
printf("8. 交换左右子树\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
T = create_tree();
break;
case 2:
pre_order(T);
printf("\n");
break;
case 3:
in_order(T);
printf("\n");
break;
case 4:
post_order(T);
printf("\n");
break;
case 5:
printf("结点个数为:%d\n", node_count(T));
break;
case 6:
printf("树的高度为:%d\n", tree_height(T));
break;
case 7:
printf("叶子结点数为:%d\n", leaf_count(T));
break;
case 8:
invert_tree(T);
break;
case 0:
break;
default:
printf("请输入正确的选项!\n");
break;
}
} while (choice != 0);
return 0;
}
```
阅读全文