C语言二叉树遍历栈实现
时间: 2023-10-26 09:56:07 浏览: 108
二叉树的遍历可以使用栈来实现,这里我以中序遍历为例进行说明。下面是使用栈实现中序遍历的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点的定义
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 栈的定义
struct Stack {
int top;
int capacity;
struct TreeNode** array;
};
// 创建一个新的栈
struct Stack* createStack(int capacity) {
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->top = -1;
stack->capacity = capacity;
stack->array = (struct TreeNode**)malloc(stack->capacity * sizeof(struct TreeNode*));
return stack;
}
// 判断栈是否为空
int isEmpty(struct Stack* stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isFull(struct Stack* stack) {
return stack->top == stack->capacity - 1;
}
// 入栈操作
void push(struct Stack* stack, struct TreeNode* item) {
if (isFull(stack)) {
return;
}
stack->array[++stack->top] = item;
}
// 出栈操作
struct TreeNode* pop(struct Stack* stack) {
if (isEmpty(stack)) {
return NULL;
}
return stack->array[stack->top--];
}
// 获取栈顶元素
struct TreeNode* peek(struct Stack* stack) {
if (isEmpty(stack)) {
return NULL;
}
return stack->array[stack->top];
}
// 中序遍历二叉树(非递归)
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
struct Stack* stack = createStack(100); // 创建一个容量为100的栈
struct TreeNode* current = root;
while (current != NULL || !isEmpty(stack)) {
// 遍历左子树并入栈
while (current != NULL) {
push(stack, current);
current = current->left;
}
// 弹出栈顶元素并访问
current = pop(stack);
printf("%d ", current->data);
// 遍历右子树
current = current->right;
}
free(stack);
}
// 测试
int main() {
// 创建一个二叉树
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->data = 1;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->data = 2;
root->left->left = NULL;
root->left->right = NULL;
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->data = 3;
root->right->left = NULL;
root->right->right = NULL;
// 中序遍历二叉树
printf("中序遍历结果:");
inorderTraversal(root);
// 释放内存
free(root->left);
free(root->right);
free(root);
return 0;
}
```
这段代码实现了中序遍历的非递归算法,通过栈来辅助遍历二叉树。首先定义了树结点的结构体 `TreeNode` 和栈的结构体 `Stack`,然后实现了栈的基本操作(创建栈、判断栈是否为空、判断栈是否已满、入栈、出栈、获取栈顶元素)。最后,在 `inorderTraversal` 函数中实现了中序遍历的非递归算法。在 `main` 函数中创建了一个二叉树,并调用 `inorderTraversal` 函数进行中序遍历。
你可以根据需要修改代码来实现其他遍历方式,比如前序遍历和后序遍历。希望这能帮到你!如果有其他问题,请继续提问。
阅读全文