完全二叉树的非递归先序遍历c语言
时间: 2024-08-28 18:03:28 浏览: 61
完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都完全填满,且最后一层的所有节点都在最左边。对于这种结构的非递归先序遍历(即根节点 -> 左子树 -> 右子树),可以使用栈来辅助完成。
以下是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;
}
阅读全文