编写一个程序,按照先序遍历的顺序建立二叉链表,读入字符顺序为ABC##DE#G##F###,然后用中序遍历(递归和非递归两种遍历算法)的方法输出二叉树里的字符。c语言实现
时间: 2024-11-07 15:24:02 浏览: 25
C++先序遍历的顺序建立二叉链表
为了在C语言中编写这个程序,我们首先需要创建一个二叉链表结构,用于存储输入的字符,并实现先序遍历。接着,我们将使用递归和非递归方法分别对二叉树进行中序遍历。
首先,我们需要定义二叉树节点的数据结构:
```c
typedef struct TreeNode {
char value;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
接下来,我们可以使用先序遍历来构建二叉链表:
```c
void buildPreorder(char input[], TreeNode** root) {
int i = 0;
*root = NULL;
while (i < strlen(input)) {
if (input[i] != '#') {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->value = input[i];
newNode->left = newNode->right = NULL;
if (*root == NULL) {
*root = newNode;
} else {
TreeNode* current = *root;
while (current->right != NULL) {
current = current->right;
}
current->right = newNode;
}
i++;
} else {
i++; // 跳过'#'
}
}
}
```
现在,我们有了先序遍历构造的二叉链表,下面将实现两种中序遍历方法:
**递归中序遍历:**
```c
void inorderRecursion(TreeNode* node, char output[]) {
if (node == NULL)
return;
inorderRecursion(node->left, output);
output[output_len++] = node->value; // 添加当前值到结果数组
inorderRecursion(node->right, output);
}
// 主函数中调用
void recursiveInOrderTraversal(TreeNode* root, char output[]) {
int output_len = 0;
inorderRecursion(root, output);
printf("%s", output); // 输出结果字符串
}
```
**非递归中序遍历:**
```c
void inorderNonRecursive(TreeNode* node, char output[], int& index) {
if (node == NULL)
return;
inorderNonRecursive(node->left, output, index);
output[index++] = node->value;
inorderNonRecursive(node->right, output, index);
}
// 主函数中调用
void iterativeInOrderTraversal(TreeNode* root, char output[]) {
int index = 0;
inorderNonRecursive(root, output, index);
printf("%s", output); // 输出结果字符串
}
```
最后,在主函数中,你可以根据需要选择其中一种方法来执行遍历:
```c
int main() {
char input[] = "A##B#C##D#E#G##F###";
TreeNode* root = NULL;
buildPreorder(input, &root);
// 选择一个遍历方法,比如递归:
recursiveInOrderTraversal(root, output_buffer);
// 或者非递归:
// iterativeInOrderTraversal(root, output_buffer);
return 0;
}
```
阅读全文