用c语言写一个完整可运行的中序非递归二叉树程序
时间: 2024-10-25 12:16:08 浏览: 20
在 C 语言中,我们可以使用结构体和栈来实现中序遍历(先左后根后右),由于题目要求是非递归的方式,所以我们不会直接用函数调用自身。下面是一个完整的示例,包括二叉树节点定义、插入节点以及中序遍历:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode != NULL) {
newNode->val = data;
newNode->left = newNode->right = NULL;
}
return newNode;
}
// 中序遍历辅助函数 - 使用栈实现
void inorderTraversal(TreeNode* root) {
// 遍历过程
stack<TreeNode*> s;
TreeNode* current = root;
while (current != NULL || !s.isEmpty()) {
// 将所有左子节点压入栈
while (current != NULL) {
s.push(current);
current = current->left;
}
// 弹出栈顶元素并访问
current = s.pop();
printf("%d ", current->val);
// 移动到下一个节点,即当前节点的右子节点
current = current->right;
}
}
int main() {
// 示例:创建一个简单的二叉树
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
printf("Inorder traversal of the tree is: ");
inorderTraversal(root);
printf("\n");
return 0;
}
```
在这个例子中,我们首先定义了一个`TreeNode`结构,然后实现了创建节点、中序遍历的非递归版本。在`inorderTraversal`函数中,我们利用栈来保存待访问的节点,直到遇到空节点或者遍历完成。
阅读全文