编写一个程序,按照先序遍历的顺序建立二叉链表,读入字符顺序为ABC##DE#G##F###,然后用中序遍历(递归和非递归两种遍历算法)的方法输出二叉树里的字符。用c语言实现
时间: 2024-10-24 19:03:51 浏览: 24
首先,我们来创建一个简单的二叉链表结构,其中包含节点数据以及指向左孩子和右孩子的指针。在这个场景下,我们将每个字符视为一个节点,输入的字符串`"ABC##DE#G##F###"`作为构建二叉链表的数据源。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 先序遍历(根-左-右)
TreeNode* buildPreorder(char* input, int start, int end) {
if (start > end)
return NULL;
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = input[start];
start++;
root->left = buildPreorder(input, start, end);
root->right = buildPreorder(input, start, end);
return root;
}
// 中序遍历(递归版本)
void inorderRecursion(TreeNode* root) {
if (root == NULL)
return;
inorderRecursion(root->left);
printf("%c", root->data);
inorderRecursion(root->right);
}
// 中序遍历(非递归版本)
void inorderNonRecursive(TreeNode* root, char stack[], int top) {
if (root == NULL)
return;
stack[top] = root->data;
top++;
inorderNonRecursive(root->left, stack, top);
inorderNonRecursive(root->right, stack, top);
while (top > 0) {
printf("%c", stack[--top]);
}
}
int main() {
char input[] = "ABC##DE#G##F###";
int length = strlen(input);
TreeNode* root = buildPreorder(input, 0, length - 1);
// 输出先序遍历结果
printf("先序遍历: ");
inorderRecursion(root);
printf("\n");
// 创建栈用于存储中序遍历结果
char stack[100];
int stackTop = 0;
// 调用非递归版中序遍历
inorderNonRecursive(root, stack, stackTop);
printf("中序遍历(非递归): ");
printf("%s\n", stack); // 这里假设数组足够大可以存放所有元素
return 0;
}
```
在这个程序中,`buildPreorder`函数用于根据给定的输入字符串构建二叉链表。`inorderRecursion`和`inorderNonRecursive`分别实现了递归和非递归的中序遍历,并打印出字符。
注意:这个示例假设输入字符串中的特殊字符`#`用于分隔左右子树,实际处理时需要解析并忽略它们。此外,这里假设栈大小固定,对于更复杂的情况可能需要动态管理栈空间。
阅读全文