用C语言编写:采用二叉链表存储方式构建二叉树,并对其进行先序、中序、后序遍历的非递归算法
时间: 2024-11-25 19:21:08 浏览: 38
在C语言中,我们可以使用结构体表示节点并利用指针连接构成二叉链表。首先,我们定义一个`Node`结构体:
```c
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
```
接下来,我们需要创建函数来构建二叉树的非递归先序、中序和后序遍历。这里使用栈数据结构来辅助操作。
### 非递归先序遍历 (Preorder Traversal)
```c
void preorder(Node* root) {
if (root == NULL) return;
Stack *stack = createStack(); // 初始化空栈
push(stack, root); // 根入栈
while (!isEmpty(stack)) {
Node* node = pop(stack);
printf("%d ", node->data); // 输出当前节点
if (node->right != NULL) push(stack, node->right);
if (node->left != NULL) push(stack, node->left);
}
destroyStack(stack); // 清理栈
}
// 创建和销毁栈的辅助函数省略
```
### 非递归中序遍历 (Inorder Traversal)
```c
void inorder(Node* root) {
if (root == NULL) return;
Stack *stack = createStack();
Node* current = root; // 中序从左子树开始
while (current != NULL || !isEmpty(stack)) {
while (current != NULL) {
push(stack, current);
current = current->left;
}
current = pop(stack);
printf("%d ", current->data); // 输出当前节点
current = current->right;
}
destroyStack(stack);
}
```
### 非递归后序遍历 (Postorder Traversal)
```c
void postorder(Node* root) {
if (root == NULL) return;
Stack *stack = createStack();
Node* current = root; // 后序从右子树开始,然后根节点
while (current != NULL || !isEmpty(stack)) {
while (current != NULL) {
push(stack, current);
current = current->right;
}
current = pop(stack);
if (current->left == NULL) { // 如果当前节点无左子节点,就是叶子节点,先处理
printf("%d ", current->data);
current = NULL;
} else {
current = current->left; // 转向左子树
}
}
destroyStack(stack);
}
```
阅读全文