用c语言编制中序非递归遍历二叉树程序,示例一个完整代码
时间: 2024-10-25 12:15:34 浏览: 29
c代码-递归创建二叉树,先序、中序、后序递归遍历二叉树
5星 · 资源好评率100%
在C语言中,中序遍历二叉树通常采用栈来实现非递归的方式,因为栈能够帮助我们模拟递归的过程。以下是完整的非递归中序遍历二叉树的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 助手函数,用于将当前节点压入栈中
void push(TreeNode* node, stack_type* s) {
if (node != NULL) {
s->top = (struct Node **) realloc(s->top, (s->size + 1) * sizeof(struct Node *));
(*s).data[s->size] = node;
(*s).size++;
push(node->left, s);
}
}
// 助手函数,弹出栈顶元素并访问它
TreeNode* pop(stack_type* s) {
if (s->size > 0) {
s->size--;
return (*s).data[s->size];
} else {
printf("Stack is empty.\n");
exit(0);
}
}
// 中序遍历非递归实现
void inorderTraversal(TreeNode* root) {
stack_type s;
s.size = 0;
s.top = NULL;
TreeNode* curr = root;
// 初始化栈为空,直到遍历完所有左子树
while (curr != NULL || s.size > 0) {
// 将左子节点和空节点压入栈
while (curr != NULL) {
push(curr, &s);
curr = curr->left;
}
// 弹出栈顶节点并访问,然后移动到右子节点
curr = pop(&s);
printf("%d ", curr->val); // 访问节点值
curr = curr->right;
}
}
int main() {
// 创建一个简单的二叉树示例
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->val = 2;
root->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->val = 3;
root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->left->val = 4;
printf("Inorder traversal using non-recursive approach:\n");
inorderTraversal(root);
free(root); // 释放内存
return 0;
}
```
在这个例子中,`inorderTraversal`函数首先将所有左子节点压入栈,然后弹出并访问栈顶节点,接着遍历其右子节点。这个过程会一直持续到栈为空并且所有的节点都被访问过。
阅读全文