C语言实现:中序遍历二叉树的非递归算法
时间: 2023-12-01 11:59:38 浏览: 254
中序遍历二叉树非递归算法
中序遍历二叉树的非递归算法可以借助栈来实现。具体步骤如下:
1. 创建一个空栈。
2. 将根节点入栈。
3. 当栈非空时,重复以下步骤:
- 将栈顶节点出栈,输出它的值。
- 如果该节点有右子树,则将右子树入栈。
- 如果该节点没有右子树且有左子树,则将左子树入栈。
4. 当栈为空时,遍历结束。
下面是该算法的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node, *Tree;
// 定义栈结构体
typedef struct Stack {
Node *data[100]; // 栈的最大容量为 100
int top; // 栈顶指针
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(Stack *s) {
return s->top == 99;
}
// 入栈
void push(Stack *s, Node *node) {
if (is_full(s)) {
printf("Error: Stack is full!\n");
return;
}
s->top++;
s->data[s->top] = node;
}
// 出栈
Node* pop(Stack *s) {
if (is_empty(s)) {
printf("Error: Stack is empty!\n");
return NULL;
}
Node *node = s->data[s->top];
s->top--;
return node;
}
// 中序遍历二叉树的非递归算法
void inorder_traversal(Tree tree) {
if (tree == NULL) {
return;
}
Stack s;
init(&s);
Node *p = tree;
while (p || !is_empty(&s)) {
while (p) {
push(&s, p);
p = p->left;
}
if (!is_empty(&s)) {
p = pop(&s);
printf("%d ", p->data);
p = p->right;
}
}
}
// 创建二叉树
Tree create_tree() {
Tree tree;
int data;
scanf("%d", &data);
if (data == -1) { // 输入 -1 表示该节点为空
tree = NULL;
} else {
tree = (Tree)malloc(sizeof(Node));
tree->data = data;
tree->left = create_tree();
tree->right = create_tree();
}
return tree;
}
int main() {
Tree tree = create_tree();
printf("中序遍历二叉树的结果为:\n");
inorder_traversal(tree);
printf("\n");
return 0;
}
```
注意,这里的二叉树节点数据类型是 `Node`,而不是 `int`,因为每个节点包含了左右子树的指针。同时,这里的栈使用了数组实现,最大容量为 100,如果需要更大的容量可以根据实际情况进行修改。
阅读全文