二叉树的先序遍历非递归c语言
时间: 2024-12-08 22:11:54 浏览: 14
二叉树的先序遍历(Preorder Traversal),顺序是根节点 -> 左子树 -> 右子树。非递归的实现通常通过栈数据结构来模拟递归过程。以下是C语言中非递归方式的二叉树先序遍历算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 先序遍历辅助函数
void preorderTraversal(TreeNode* root) {
if (root == NULL) return; // 遍历结束条件
// 创建一个栈并压入根节点
Stack* stack = createStack();
push(stack, root);
while (!isEmpty(stack)) {
// 弹出栈顶元素,访问并检查其左右子节点
TreeNode* node = pop(stack);
printf("%d ", node->val); // 输出节点值
// 如果有右子节点,压入栈
if (node->right != NULL) push(stack, node->right);
// 再处理左子节点,因为栈是后进先出,这里需要把左子节点放在右子节点前面
if (node->left != NULL) push(stack, node->left);
}
// 关闭栈
destroyStack(stack);
}
// 创建一个栈的简单示例,实际项目中可能需要自定义
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = -1;
stack->size = 0;
stack->array = (TreeNode**)malloc(sizeof(TreeNode*) * MAX_SIZE);
return stack;
}
// 其他辅助函数,如pop, isEmpty, destroyStack等
int main() {
// 这里假设已经构建了一个二叉树
TreeNode* root = ...;
preorderTraversal(root);
return 0;
}
```
阅读全文