如何用C语言实现二叉树的非递归先序遍历和中序遍历?请详细描述遍历流程并给出代码示例。
时间: 2024-12-06 18:30:07 浏览: 20
在探索数据结构时,掌握二叉树的非递归遍历方法是非常关键的。特别是当你需要使用C语言来实现时,正确使用栈结构来模拟递归过程就显得尤为重要。在《C语言实现二叉树非递归遍历:先序与中序》一书中,不仅详细介绍了非递归遍历的算法和技巧,还提供了相应的代码实现。
参考资源链接:[C语言实现二叉树非递归遍历:先序与中序](https://wenku.csdn.net/doc/4gv33dr9cj?spm=1055.2569.3001.10343)
非递归先序遍历的步骤可以概述如下:
1. 创建一个空栈s,并将根节点root压入栈中。
2. 当栈不为空时,循环执行以下操作:
- 弹出栈顶节点,并将其值输出(或者进行其他处理)。
- 如果弹出的节点有右子节点,将右子节点压入栈。
- 如果弹出的节点有左子节点,将左子节点压入栈。
非递归中序遍历的步骤稍微复杂一些:
1. 创建一个空栈s,并初始化一个指针cur指向根节点。
2. 当cur不为空或栈不为空时,执行以下步骤:
- 将cur指向的节点的左子节点压入栈,并更新cur为当前节点的左子节点。
- 如果cur为空,说明左子树已遍历完毕,弹出栈顶节点并输出(或者进行其他处理),然后更新cur为栈顶节点的右子节点。
- 重复上述步骤,直到cur为空且栈为空。
以下是C语言实现的先序遍历和中序遍历的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct StackNode {
TreeNode *treenode;
struct StackNode *next;
} StackNode;
// 创建栈节点
StackNode* createStackNode(TreeNode *node) {
StackNode *newNode = (StackNode*)malloc(sizeof(StackNode));
newNode->treenode = node;
newNode->next = NULL;
return newNode;
}
// 先序遍历的非递归实现
void preorderTraversal(TreeNode *root) {
if (root == NULL) return;
StackNode *stack = NULL;
TreeNode *current = root;
while (current != NULL || stack != NULL) {
while (current != NULL) {
printf(
参考资源链接:[C语言实现二叉树非递归遍历:先序与中序](https://wenku.csdn.net/doc/4gv33dr9cj?spm=1055.2569.3001.10343)
阅读全文