先中后序遍历非递归c语言
时间: 2024-11-12 14:05:09 浏览: 23
在C语言中,先序遍历和后序遍历通常是用于二叉树的数据结构操作。非递归实现是一种避免使用函数嵌套的技术,通常通过栈来辅助遍历过程。以下是先序遍历(根节点-左子树-右子树)和后序遍历(左子树-右子树-根节点)的非递归C语言实现:
**先序遍历(Preorder Traversal):**
```c
void preorder非递归(Node* root) {
if (root == NULL)
return;
// 将当前节点压入栈中
Stack *stack = createStack();
push(stack, root);
while (!isEmpty(stack)) {
Node *temp = pop(stack);
printf("%d ", temp->data); // 访问当前节点
// 如果还有右孩子,则压入右孩子
if (temp->right != NULL)
push(stack, temp->right);
// 然后访问左孩子
if (temp->left != NULL)
push(stack, temp->left);
}
destroyStack(stack);
}
```
**后序遍历(Postorder Traversal):**
```c
void postorder非递归(Node* root) {
if (root == NULL)
return;
// 使用两个栈
Stack *stack1 = createStack(), *stack2 = createStack();
stack2->top = root;
while (!isEmpty(stack1) || !isEmpty(stack2)) {
if (stack2->top != NULL) {
push(stack1, stack2->top);
stack2->top = stack2->top->left;
} else {
Node *temp = pop(stack1);
// 左右孩子都已处理完,访问该节点并把右孩子推回栈
printf("%d ", temp->data);
if (temp->right != NULL)
push(stack2, temp->right);
}
}
destroyStack(stack1);
destroyStack(stack2);
}
```
阅读全文