1、前序遍历
二叉树的前序遍历是一种遍历策略,按照根节点→左子树→右子树的顺序访问所有节点。这种方法首先访问根节点,然后遍历左子树,最后遍历右子树。
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 前序遍历
void preorderTraversal(Node* root) {
if (root == NULL) return;
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 释放二叉树节点的内存
void freeTree(Node* root) {
if (root == NULL) return;
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
// 创建二叉树
Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
// 输出前序遍历结果
printf("前序遍历: ");
preorderTraversal(root);
printf("\n");
// 释放内存
freeTree(root);
return 0;
}
2、中序遍历
二叉树的中序遍历(Inorder traversal)是另一种深度优先的遍历方法,其遍历顺序为:先遍历左子树,然后访问根节点,最后遍历右子树。中序遍历对于二叉搜索树特别有用,因为这种遍历方式会按照节点的键值(Key)升序访问所有节点。
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 中序遍历
void inorderTraversal(Node* root) {
if (root == NULL) return;
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
// 释放二叉树节点的内存
void freeTree(Node* root) {
if (root == NULL) return;
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
// 创建二叉树
Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
// 输出中序遍历结果
printf("中序遍历: ");
inorderTraversal(root);
printf("\n");
// 释放内存
freeTree(root);
return 0;
}
3、后序遍历
二叉树的后序遍历(Postorder traversal)是一种深度优先的遍历方法,主要特点是首先遍历所有子节点,最后才访问根节点。首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问当前的根节点。
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 后序遍历
void postorderTraversal(Node* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
// 释放二叉树节点的内存
void freeTree(Node* root) {
if (root == NULL) return;
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
// 创建二叉树
Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
// 输出后序遍历结果
printf("后序遍历: ");
postorderTraversal(root);
printf("\n");
// 释放内存
freeTree(root);
return 0;
}