递归和非递归遍历二叉树的先序
二叉树
二叉树是一种数据结构,由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。它们之间存在父子关系,每个节点最多有一个父节点(根节点除外)。这种树状结构在计算机科学和程序设计中广泛应用,能够高效地组织和存储数据。
二叉树的先序
二叉树的先序遍历是一种遍历方式,按照先访问根节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树的顺序来访问二叉树中的节点。在先序遍历中,节点的访问顺序是根节点 -> 左子树 -> 右子树。
下面将用两种方法遍历二叉树的先序
一、递归
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 先序遍历函数(递归)
void preorderRecursive(struct TreeNode* root) {
if (root != NULL) {
printf("%d ", root->data); // 访问当前节点
preorderRecursive(root->left); // 遍历左子树
preorderRecursive(root->right); // 遍历右子树
}
}
// 创建新节点
struct TreeNode* createNode(int value) {
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
int main() {
// 创建一个示例二叉树
struct TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
printf("递归先序遍历结果:\n");
preorderRecursive(root);
return 0;
}
二、非递归
可以使用非递归的方法来遍历二叉树的先序。一种常见的方法是使用栈来模拟递归的过程。具体步骤如下:
1、创建一个栈来辅助遍历。
2、将根节点压入栈中。
3、循环执行以下步骤直到栈为空:
.弹出栈顶节点,访问该节点。
.如果该节点有右子节点,将右子节点压入栈中。
.如果该节点有左子节点,将左子节点压入栈中。
这种非递归方法模拟了先序遍历的过程,通过栈的操作来遍历每个节点,确保了先访问根节点,然后左子树,最后右子树的顺序。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义二叉树节点结构
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 定义栈结构
struct Stack {
int top;
struct TreeNode* array[MAX_SIZE];
};
// 创建栈
struct Stack* createStack() {
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->top = -1;
return stack;
}
// 检查栈是否为空
int isEmpty(struct Stack* stack) {
return stack->top == -1;
}
// 将元素推入栈
void push(struct Stack* stack, struct TreeNode* item) {
stack->array[++stack->top] = item;
}
// 从栈中弹出元素
struct TreeNode* pop(struct Stack* stack) {
if (isEmpty(stack))
return NULL;
return stack->array[stack->top--];
}
// 先序遍历函数(非递归)
void preorderIterative(struct TreeNode* root) {
if (root == NULL)
return;
struct Stack* stack = createStack();
push(stack, root);
while (!isEmpty(stack)) {
struct TreeNode* node = pop(stack);
printf("%d ", node->data); // 访问当前节点
if (node->right)
push(stack, node->right); // 先将右子节点推入栈
if (node->left)
push(stack, node->left); // 再将左子节点推入栈
}
}
int main() {
// 创建一个示例二叉树
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->data = 1;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->data = 2;
root->right->data = 3;
root->left->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->left->data = 4;
root->left->right->data = 5;
printf("非递归先序遍历结果:\n");
preorderIterative(root);
return 0;
}
以上为递归和非递归的方法遍历二叉树的先序,希望能帮到你