二叉树的非递归先序遍历c语言代码
时间: 2023-03-12 08:13:59 浏览: 181
非递归先序遍历二叉树的c语言代码如下: 1. 建立一个栈,将根节点入栈
2. 循环,只要栈不为空,就进行以下操作:
a) 取出栈顶元素,访问该节点
b) 如果其右子节点不为空,将右子节点入栈
c) 如果其左子节点不为空,将左子节点入栈
3. 退出循环
相关问题
完全二叉树的非递归先序遍历c语言
完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都完全填满,且最后一层的所有节点都在最左边。对于这种结构的非递归先序遍历(即根节点 -> 左子树 -> 右子树),可以使用栈来辅助完成。
以下是C语言的非递归先序遍历算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义结点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 先序遍历函数
void preorderTraversal(TreeNode* root) {
if (root == NULL) return; // 如果当前节点为空,则返回
// 创建一个栈,初始时只放根节点
Stack* stack = createStack();
push(stack, root);
while (!isEmpty(stack)) {
// 弹出栈顶节点并访问
TreeNode* node = pop(stack);
printf("%d ", node->val); // 输出当前节点值
// 如果左子节点存在,入栈
if (node->left != NULL)
push(stack, node->left);
// 如果右子节点存在,入栈
if (node->right != NULL)
push(stack, node->right);
}
// 销毁栈
destroyStack(stack);
}
// 辅助函数,创建空栈
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = -1;
stack->size = 0;
return stack;
}
// 辅助函数,检查栈是否为空
int isEmpty(Stack* stack) {
return stack->top == -1;
}
// 辅助函数,销毁栈
void destroyStack(Stack* stack) {
free(stack);
}
// 辅助函数,向栈中添加元素
void push(Stack* stack, TreeNode* node) {
stack->top++;
stack->data[stack->top] = node;
stack->size++;
}
// 辅助函数,从栈中移除并返回顶部元素
TreeNode* pop(Stack* stack) {
if (isEmpty(stack))
return NULL;
TreeNode* node = stack->data[stack->top];
stack->top--;
stack->size--;
return node;
}
int main() {
// 创建一个完整二叉树实例并进行遍历
TreeNode* tree = ... // 实例化并构建你的完整二叉树
preorderTraversal(tree);
return 0;
}
非递归实现二叉树的先序遍历c语言
非递归实现二叉树的先序遍历(Preorder Traversal)通常使用栈数据结构来辅助完成。在C语言中,步骤如下:
1. 创建一个函数,例如`void preorderTraversal(TreeNode* root)`,接收根节点作为输入。
2. 如果根节点为空,则直接返回。
3. 准备一个栈,并将根节点压入栈中。
4. 当栈不为空时,执行循环:
a. 弹出栈顶元素,访问该节点(通常是打印或存储节点值)。
b. 如果当前节点的右子节点存在,将其压入栈中。
c. 如果当前节点的左子节点存在,也将其压入栈中,因为我们需要先访问左子树。
5. 循环结束后,树的所有节点都已按照先序遍历顺序处理。
下面是C语言中非递归版本的先序遍历示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 先序遍历的核心函数
void preorderTraversalHelper(TreeNode* node, stack_type* s) {
if (node == NULL) return;
// 访问节点
printf("%d ", node->val);
// 将右子节点入栈
push(s, node->right);
// 将左子节点入栈
push(s, node->left);
}
// 使用栈辅助的非递归遍历
void preorderTraversal(TreeNode* root) {
stack_type s;
stack_init(&s); // 初始化栈
// 当栈不空时,继续遍历
while (!stack_empty(&s)) {
TreeNode* node = pop(&s); // 弹出栈顶节点
preorderTraversalHelper(node, &s); // 调用辅助函数
}
stack_destroy(&s); // 销毁栈
}
int main() {
// 你的二叉树实例
// ...
preorderTraversal(root); // 调用遍历函数
return 0;
}
```
阅读全文
相关推荐













