编写一个程序,按照先序遍历的顺序建立二叉链表,读入字符顺序为ABC##DE#G##F###,然后用中序遍历(递归和非递归两种遍历算法)的方法输出二叉树里的字符。c语言实现,总代码
时间: 2024-11-06 20:21:13 浏览: 5
为了实现这个功能,首先我们需要创建一个二叉树结构,将输入的字符串分割成节点,然后分别进行先序和中序遍历。这里我会提供一个基本的C语言实现,包括构建二叉树、先序遍历和中序遍历。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义二叉树节点结构
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} Node;
// 先序遍历函数 (递归)
void preorder(Node* root) {
if (root != NULL) {
printf("%c ", root->data);
preorder(root->left);
preorder(root->right);
}
}
// 非递归先序遍历
void preorder_iterative(Node* root) {
if (root == NULL) return;
Stack *stack = create_stack();
push(stack, root);
while (!is_empty(stack)) {
Node *node = pop(stack);
printf("%c ", node->data);
if (node->right) push(stack, node->right);
if (node->left) push(stack, node->left);
}
destroy_stack(stack);
}
// 中序遍历 (递归)
void inorder(Node* root) {
if (root != NULL) {
inorder(root->left);
printf("%c ", root->data);
inorder(root->right);
}
}
// 非递归中序遍历 (使用栈)
void inorder_iterative(Node* root) {
Stack *stack = create_stack();
Node *prev = NULL;
while (root || !is_empty(stack)) {
while (root) {
push(stack, root);
root = root->left;
}
root = pop(stack);
printf("%c ", root->data);
prev = root;
root = root->right;
}
destroy_stack(stack);
}
// 主函数,处理输入并进行遍历
int main() {
const char* input = "ABC##DE#G##F###";
char str[50];
strcpy(str, input);
Node *root = build_tree(str);
// 先序遍历
printf("Preorder (recursive): ");
preorder(root);
printf("\nPreorder (iterative): ");
preorder_iterative(root);
// 中序遍历
printf("\nInorder (recursive): ");
inorder(root);
printf("\nInorder (iterative): ");
inorder_iterative(root);
destroy_tree(root); // 清理内存
return 0;
}
// 辅助函数,用于构建二叉树等
Node* build_tree(char* str) { ... } // 实现细节略
Stack* create_stack() { ... } // 创建堆栈
char pop(Stack* stack) { ... } // 弹出堆栈元素
bool is_empty(Stack* stack) { ... } // 判断堆栈是否为空
void push(Stack* stack, Node* node) { ... } // 压入堆栈元素
void destroy_stack(Stack* stack) { ... } // 销毁堆栈
void destroy_tree(Node* root) { ... } // 销毁二叉树
阅读全文