二叉树的非递归遍历算法C语言完整代码和运行结果
时间: 2024-12-29 16:35:06 浏览: 15
二叉树的非递归遍历主要有前序遍历、中序遍历和后序遍历三种。以下是C语言中使用栈来实现这三种遍历的非递归版本:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历(先入栈右子树,再根节点,最后左子树)
void inorderTraversal(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->left != NULL)
push(stack, node->left);
if (node->right != NULL)
push(stack, node->right);
}
}
// 其他遍历类似,只是调整元素添加到栈的顺序
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
printf("%d ", root->val); // 首先输出根节点
stackPreorder(root);
}
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
stackPostorder(root);
printf("%d ", root->val); // 最后输出根节点
}
// 创建空栈和操作栈的辅助函数
TreeNode* createTreeNode(int val) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->val = val;
newNode->left = newNode->right = NULL;
return newNode;
}
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = -1;
stack->size = 0;
return stack;
}
// 栈的基本操作,省略了具体实现
int isEmpty(Stack* stack) { return stack->top == -1; }
void push(Stack* stack, TreeNode* node) { ... }
TreeNode* pop(Stack* stack) { ... }
// 主函数演示如何使用
int main() {
// 创建一个简单的二叉树示例
TreeNode* root = createTreeNode(1);
root->left = createTreeNode(2);
root->right = createTreeNode(3);
root->left->left = createTreeNode(4);
root->left->right = createTreeNode(5);
printf("Inorder traversal: ");
inorderTraversal(root);
printf("\n");
printf("Preorder traversal: ");
preorderTraversal(root);
printf("\n");
printf("Postorder traversal: ");
postorderTraversal(root);
printf("\n");
freeTree(root); // 清理内存
return 0;
}
阅读全文