c语言编制中序非递归遍历二叉树程序
时间: 2024-10-26 18:03:10 浏览: 29
C语言二叉树的非递归遍历实例分析
5星 · 资源好评率100%
在C语言中,非递归遍历二叉树通常采用栈的数据结构。以下是中序遍历(先左后根右)的非递归实现,即前序遍历(左-根-右)的反转过程:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历辅助函数,将节点压入栈,然后访问左子树
void inorder_helper(TreeNode* root, Stack* stack) {
if (root == NULL) return;
// 先把左子树压入栈
inorder_helper(root->left, stack);
// 然后访问根节点
printf("%d ", root->val);
// 最后访问右子树
inorder_helper(root->right, stack);
}
// 非递归中序遍历主函数
void inorderTraversal(TreeNode* root) {
Stack stack;
stack.top = -1;
inorder_helper(root, &stack);
}
// 创建一个新的二叉树结点
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 测试用例
int main() {
// 创建一个二叉树
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
inorderTraversal(root);
return 0;
}
```
在这个程序中,`inorder_helper` 函数负责实际的遍历过程,通过递归调用自己并利用栈来模拟递归过程,实现了非递归遍历。`main` 函数创建了一个简单的二叉树,并调用 `inorderTraversal` 进行中序遍历。
如果你想了解其他类型的遍历(如后序、预序等),只需要稍微调整一下 `inorder_helper` 函数的顺序即可。
阅读全文