如何用C语言实现二叉树的非递归先序遍历和中序遍历?请详细描述遍历流程并给出代码示例。
时间: 2024-12-06 17:30:07 浏览: 18
在处理二叉树遍历的算法实现时,掌握非递归方法对于优化性能和处理特定场景非常重要。对于先序遍历和中序遍历,非递归实现的核心在于合理利用栈结构。以下将详细描述这两种遍历的非递归实现流程,并提供相应的C语言代码示例。
参考资源链接:[C语言实现二叉树非递归遍历:先序与中序](https://wenku.csdn.net/doc/4gv33dr9cj?spm=1055.2569.3001.10343)
先序遍历的非递归实现流程:
1. 创建一个空栈。
2. 将根节点压入栈中。
3. 当栈不为空时,循环执行以下步骤:
- 弹出栈顶元素作为当前节点,并进行处理(例如打印节点值)。
- 如果当前节点有右子节点,则将右子节点压入栈中。
- 如果当前节点有左子节点,则将左子节点压入栈中。
中序遍历的非递归实现流程:
1. 创建一个空栈。
2. 设置一个指针`current`指向根节点。
3. 当`current`不为空或栈不为空时,循环执行以下步骤:
- 当`current`不为空时,将其左子节点压入栈中,并将`current`指针更新为左子节点。
- 当`current`为空时,弹出栈顶元素并处理(例如打印节点值),然后将`current`指针更新为当前节点的右子节点。
以下是使用C语言实现这两种遍历的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct Stack {
TreeNode **elements;
int top;
int maxSize;
} Stack;
Stack* createStack(int size) {
Stack *stack = (Stack*)malloc(sizeof(Stack));
stack->elements = (TreeNode**)malloc(sizeof(TreeNode*) * size);
stack->top = -1;
stack->maxSize = size;
return stack;
}
int isStackEmpty(Stack *stack) {
return stack->top == -1;
}
void push(Stack *stack, TreeNode *node) {
if (stack->top < stack->maxSize - 1) {
stack->elements[++stack->top] = node;
}
}
TreeNode* pop(Stack *stack) {
if (!isStackEmpty(stack)) {
return stack->elements[stack->top--];
}
return NULL;
}
void preorderTraversal(TreeNode *root) {
if (root == NULL) return;
Stack *stack = createStack(100); // 假设栈的最大容量为100
push(stack, root);
while (!isStackEmpty(stack)) {
TreeNode *current = pop(stack);
printf(
参考资源链接:[C语言实现二叉树非递归遍历:先序与中序](https://wenku.csdn.net/doc/4gv33dr9cj?spm=1055.2569.3001.10343)
阅读全文