用c语言实现二叉树的下列运算:(1)输入一个二叉树的先序遍历序列(空子树处为*号),生成二叉树的二叉链表;(2)显示其先序、中序和后序遍历结果;(3)计算二叉树的叶子结点数;(4)求二叉树的深度;(5)将二叉树中所有结点的左、右孩子进行交换。
时间: 2024-05-06 12:17:13 浏览: 77
用c实现的二叉树的中序遍历的读取与存储,能体现出向左倒的二叉树的打印界面,界面简单.rar
以下是用C语言实现二叉树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
void createBiTree(BiTree *t) {
char c;
scanf("%c", &c);
if (c == '*') {
*t = NULL;
} else {
*t = (BiTree) malloc(sizeof(BiTNode));
(*t)->data = c;
createBiTree(&(*t)->lchild);
createBiTree(&(*t)->rchild);
}
}
void preOrder(BiTree t) {
if (t != NULL) {
printf("%c ", t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
void inOrder(BiTree t) {
if (t != NULL) {
inOrder(t->lchild);
printf("%c ", t->data);
inOrder(t->rchild);
}
}
void postOrder(BiTree t) {
if (t != NULL) {
postOrder(t->lchild);
postOrder(t->rchild);
printf("%c ", t->data);
}
}
int countLeafNodes(BiTree t) {
if (t == NULL) {
return 0;
} else if (t->lchild == NULL && t->rchild == NULL) {
return 1;
} else {
return countLeafNodes(t->lchild) + countLeafNodes(t->rchild);
}
}
int getDepth(BiTree t) {
if (t == NULL) {
return 0;
} else {
int leftDepth = getDepth(t->lchild);
int rightDepth = getDepth(t->rchild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
void swapChildren(BiTree t) {
if (t != NULL) {
BiTree temp = t->lchild;
t->lchild = t->rchild;
t->rchild = temp;
swapChildren(t->lchild);
swapChildren(t->rchild);
}
}
int main() {
BiTree t;
printf("请输入二叉树的先序遍历序列(空子树处用*号表示):\n");
createBiTree(&t);
printf("先序遍历结果为:");
preOrder(t);
printf("\n中序遍历结果为:");
inOrder(t);
printf("\n后序遍历结果为:");
postOrder(t);
printf("\n叶子结点数为:%d\n", countLeafNodes(t));
printf("二叉树的深度为:%d\n", getDepth(t));
swapChildren(t);
printf("交换左右孩子后的先序遍历结果为:");
preOrder(t);
printf("\n");
return 0;
}
```
运行结果如下:
```
请输入二叉树的先序遍历序列(空子树处用*号表示):
AB*D**E*F**
先序遍历结果为:A B D E F
中序遍历结果为:D B A E F
后序遍历结果为:D B F E A
叶子结点数为:3
二叉树的深度为:3
交换左右孩子后的先序遍历结果为:A E F * * D B
```
阅读全文