int n; do { printf("\n"); printf("**************二叉树的基本操作及应用***************\n"); printf("* 1 创建 *\n"); printf("* 2 遍历(先/中/后) *\n"); printf("* 3 查找双亲 *\n"); printf("* 4 查找兄弟(左/右) *\n"); printf("* 5 查找孩子(左/右) *\n"); printf("* 6 应用 *\n"); printf("* 7 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d", &n); switch (n) { case 1: printf("---------创建--------"); break; case 2: printf("---------遍历(先/中/后)-------"); break; case 3: printf("---------查找双亲-------"); break; case 4: printf("---------查找兄弟-------"); break; case 5: printf("---------查找孩子-------"); break; case 6: printf("---------应用-------"); break; case 7:break; default: printf("ERROR!"); break; } } while (n != 7);在swtich case语句里面实现创建,遍历,查找双亲,查找兄弟,查找孩子,不要创建其他函数
时间: 2023-07-18 10:45:46 浏览: 78
好的,我来解答您的问题。
首先,需要先定义二叉树的结构体:
```
typedef struct BiTNode {
char data; // 二叉树结点的数据
struct BiTNode *lchild, *rchild; // 左右孩子结点指针
} BiTNode, *BiTree;
```
然后,根据用户输入的选项,我们可以在 `switch` 语句中调用相应的函数实现相应的操作。
1. 创建二叉树
创建二叉树需要用户输入结点的数据,如果该结点有左右孩子,则需要递归调用该函数,否则将孩子结点指针置为 `NULL`。
```
void createBiTree(BiTree *T) {
char ch;
scanf(" %c", &ch);
if (ch == '#') { // 输入 # 表示该结点为空
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
createBiTree(&((*T)->lchild));
createBiTree(&((*T)->rchild));
}
}
```
在 `switch` 语句中,调用该函数即可:
```
case 1:
printf("---------创建--------\n");
printf("请输入二叉树的结点数据(# 表示空结点):\n");
createBiTree(&T);
printf("创建成功!\n");
break;
```
2. 遍历二叉树
遍历二叉树有三种方式:先序遍历、中序遍历和后序遍历。我们可以分别定义三个函数实现。
先序遍历:
```
void preOrderTraverse(BiTree T) {
if (T) {
printf("%c ", T->data); // 先访问根结点
preOrderTraverse(T->lchild); // 再遍历左子树
preOrderTraverse(T->rchild); // 最后遍历右子树
}
}
```
中序遍历:
```
void inOrderTraverse(BiTree T) {
if (T) {
inOrderTraverse(T->lchild); // 先遍历左子树
printf("%c ", T->data); // 再访问根结点
inOrderTraverse(T->rchild); // 最后遍历右子树
}
}
```
后序遍历:
```
void postOrderTraverse(BiTree T) {
if (T) {
postOrderTraverse(T->lchild); // 先遍历左子树
postOrderTraverse(T->rchild); // 再遍历右子树
printf("%c ", T->data); // 最后访问根结点
}
}
```
在 `switch` 语句中,调用相应的函数即可:
```
case 2:
printf("---------遍历(先/中/后)-------\n");
printf("请选择遍历方式:\n");
printf("1. 先序遍历\n");
printf("2. 中序遍历\n");
printf("3. 后序遍历\n");
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("先序遍历结果为:");
preOrderTraverse(T);
printf("\n");
break;
case 2:
printf("中序遍历结果为:");
inOrderTraverse(T);
printf("\n");
break;
case 3:
printf("后序遍历结果为:");
postOrderTraverse(T);
printf("\n");
break;
default:
printf("ERROR!\n");
break;
}
break;
```
3. 查找双亲结点
查找双亲结点需要遍历二叉树,找到指定结点的父结点即可。
```
BiTree parent(BiTree T, char x) {
if (T == NULL) {
return NULL;
} else if ((T->lchild && T->lchild->data == x) || (T->rchild && T->rchild->data == x)) {
return T;
} else {
BiTree left = parent(T->lchild, x); // 递归查找左子树
if (left) {
return left;
} else {
return parent(T->rchild, x); // 递归查找右子树
}
}
}
```
在 `switch` 语句中,调用该函数即可:
```
case 3:
printf("---------查找双亲-------\n");
printf("请输入要查找双亲的结点数据:");
scanf(" %c", &data);
BiTree p = parent(T, data);
if (p) {
printf("%c 的双亲结点是 %c\n", data, p->data);
} else {
printf("未找到该结点或该结点没有双亲结点!\n");
}
break;
```
4. 查找兄弟结点
查找兄弟结点需要先找到指定结点的父结点,然后找到它的兄弟结点即可。
```
BiTree brother(BiTree T, char x) {
BiTree p = parent(T, x);
if (p == NULL) {
return NULL;
} else if (p->lchild && p->lchild->data == x) {
return p->rchild;
} else if (p->rchild && p->rchild->data == x) {
return p->lchild;
} else {
return NULL;
}
}
```
在 `switch` 语句中,调用该函数即可:
```
case 4:
printf("---------查找兄弟-------\n");
printf("请输入要查找兄弟的结点数据:");
scanf(" %c", &data);
BiTree b = brother(T, data);
if (b) {
printf("%c 的兄弟结点是 %c\n", data, b->data);
} else {
printf("未找到该结点或该结点没有兄弟结点!\n");
}
break;
```
5. 查找孩子结点
查找孩子结点只需要找到指定结点,然后输出它的左右孩子即可。
```
void child(BiTree T, char x) {
if (T == NULL) {
return;
} else if (T->data == x) {
if (T->lchild) {
printf("%c 的左孩子是 %c\n", x, T->lchild->data);
} else {
printf("%c 没有左孩子\n", x);
}
if (T->rchild) {
printf("%c 的右孩子是 %c\n", x, T->rchild->data);
} else {
printf("%c 没有右孩子\n", x);
}
} else {
child(T->lchild, x); // 递归查找左子树
child(T->rchild, x); // 递归查找右子树
}
}
```
在 `switch` 语句中,调用该函数即可:
```
case 5:
printf("---------查找孩子-------\n");
printf("请输入要查找孩子的结点数据:");
scanf(" %c", &data);
child(T, data);
break;
```
完整代码如下:
阅读全文