编写一道这样的程序1.要求采用二叉链表作为存贮结构,完成二叉树的建立、先序、中序、和后序遍历的操作。其中先序遍历和后序遍历采用递归算法,中序遍历采用非递归算法。 2.输入数据:树中每个结点的数据类型设定为字符型。
时间: 2024-02-13 17:06:58 浏览: 76
好的,下面是程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 先序遍历
void preOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历
void inOrderTraversal(TreeNode* root) {
TreeNode* stack[100];
int top = -1;
TreeNode* p = root;
while (p != NULL || top != -1) {
while (p != NULL) {
stack[++top] = p;
p = p->left;
}
if (top != -1) {
p = stack[top--];
printf("%c ", p->data);
p = p->right;
}
}
}
// 后序遍历
void postOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%c ", root->data);
}
// 创建二叉树
TreeNode* createTree() {
char c;
scanf("%c", &c);
if (c == '#') {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = c;
root->left = createTree();
root->right = createTree();
return root;
}
int main() {
printf("请输入二叉树的先序遍历序列(其中'#'表示空节点):\n");
TreeNode* root = createTree();
printf("先序遍历结果为:");
preOrderTraversal(root);
printf("\n");
printf("中序遍历结果为:");
inOrderTraversal(root);
printf("\n");
printf("后序遍历结果为:");
postOrderTraversal(root);
printf("\n");
return 0;
}
```
程序说明:
1. `TreeNode` 结构体表示二叉树的节点,包含数据域 `data` 和左右子树指针 `left` 和 `right`。
2. 先序遍历、中序遍历和后序遍历分别用了不同的算法实现。其中,中序遍历采用了非递归算法,使用栈来辅助实现。
3. `createTree()` 函数递归地创建二叉树,输入先序遍历序列即可。
4. 在 `main()` 函数中调用各个遍历函数,输出遍历结果。
注意事项:
1. 在创建二叉树时,输入先序遍历序列时要注意写法,输入格式类似于 `AB#C##D##`,其中 `#` 表示空节点。
2. 输入完先序遍历序列后,要记得使用 `getchar()` 消耗掉输入流中的回车符。
阅读全文