用c语言编制中序非递归遍历二叉树程序,二叉树从键盘输入
时间: 2024-10-25 10:02:08 浏览: 15
在C语言中,非递归的中序遍历二叉树通常需要辅助栈来存储遍历过程。以下是使用栈来实现中序遍历二叉树的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义二叉树节点
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} Node;
// 创建新节点并获取输入
Node* createNode() {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
while (true) {
newNode->data = getchar();
if (newNode->data == '#' || isspace(newNode->data)) break; // 输入结束符或空格
newNode->left = newNode->right = NULL; // 初始化左右子树
}
return newNode;
}
// 助理函数:用于入栈
void pushStack(char* stack[], int* top, char val) {
*top += 1;
stack[*top] = val;
}
// 助理函数:用于出栈并打印元素
void popAndPrint(char* stack[], int top) {
if (top > 0) {
printf("%c", stack[top]);
top--;
} else {
printf("Stack is empty.\n");
}
}
// 非递归中序遍历
void inorderTraversalNonRecursive(Node* root) {
char* stack = (char*)malloc(sizeof(char) * 50);
int top = 0;
Node* current = root;
// 入栈:当前节点
while (current != NULL || top > 0) {
while (current != NULL) {
pushStack(stack, &top, current->data);
current = current->left;
}
// 出栈并访问节点
current = stack[top];
popAndPrint(stack, top);
// 移动到右子树
current = current->right;
}
free(stack);
}
int main() {
Node* root = createNode(); // 获取二叉树根节点
if (root != NULL) {
printf("Non-recursive In-order traversal: ");
inorderTraversalNonRecursive(root);
printf("\n");
}
free(root); // 释放内存
return 0;
}
```
这个程序首先读取用户的输入构建二叉树,然后调用`inorderTraversalNonRecursive`函数对树进行非递归中序遍历。输入结束后,程序将按照中序顺序打印节点数据。
阅读全文