c语言二叉树的前序遍历(非递归)
作者:野牛程序员:2024-01-03 21:54:39C语言阅读 2657
使用栈实现C语言中二叉树的前序遍历(非递归)可以按照以下方式进行:
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点的定义
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 栈节点的定义
struct StackNode {
struct TreeNode* node;
struct StackNode* next;
};
// 栈的定义
struct Stack {
struct StackNode* top;
};
// 初始化栈
void initStack(struct Stack* stack) {
stack->top = NULL;
}
// 判断栈是否为空
int isEmpty(struct Stack* stack) {
return (stack->top == NULL);
}
// 将节点入栈
void push(struct Stack* stack, struct TreeNode* node) {
struct StackNode* newNode = (struct StackNode*)malloc(sizeof(struct StackNode));
newNode->node = node;
newNode->next = stack->top;
stack->top = newNode;
}
// 将栈顶节点出栈
struct TreeNode* pop(struct Stack* stack) {
if (isEmpty(stack)) {
return NULL;
}
struct StackNode* temp = stack->top;
stack->top = stack->top->next;
struct TreeNode* poppedNode = temp->node;
free(temp);
return poppedNode;
}
// 前序遍历二叉树(非递归)
void preOrderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
struct Stack stack;
initStack(&stack);
push(&stack, root);
while (!isEmpty(&stack)) {
struct TreeNode* current = pop(&stack);
printf("%d ", current->data);
// 注意:由于栈是先进后出的结构,所以先将右子树入栈,再将左子树入栈
if (current->right != NULL) {
push(&stack, current->right);
}
if (current->left != NULL) {
push(&stack, current->left);
}
}
}
// 测试
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("前序遍历结果: ");
preOrderTraversal(root);
return 0;
}这段代码实现了使用栈进行非递归的二叉树前序遍历。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:c语言二叉树的中序遍历(递归)
- 下一篇:c语言二叉树的前序遍历(递归)
