二叉树遍历是按特定规则访问树中每个节点一次且仅一次的过程,核心目的是将树形结构数据转化为线性序列。
三种基本遍历方式(以根节点为基准)
1. 前序遍历(根左右)
顺序:先访问根节点,再递归遍历左子树,最后递归遍历右子树。
2. 中序遍历(左根右)
顺序:先递归遍历左子树,再访问根节点,最后递归遍历右子树。
3. 后序遍历(左右根)
顺序:先递归遍历左子树,再递归遍历右子树,最后访问根节点。
以下是用 C 语言实现二叉树三种遍历(前序、中序、后序)的完整代码,包含二叉树的创建、遍历和释放功能:
#include
#include
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node *left; // 左子节点指针
struct Node *right; // 右子节点指针
} Node;
// 创建新节点(数据域初始化,左右指针置空)
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败!\n");
return NULL;
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 前序遍历(根左右)
void preOrderTraversal(Node* root) {
if (root != NULL) {
printf("%d ", root->data); // 访问根节点
preOrderTraversal(root->left); // 递归遍历左子树
preOrderTraversal(root->right); // 递归遍历右子树
}
}
// 中序遍历(左根右)
void inOrderTraversal(Node* root) {
if (root != NULL) {
inOrderTraversal(root->left); // 递归遍历左子树
printf("%d ", root->data); // 访问根节点
inOrderTraversal(root->right); // 递归遍历右子树
}
}
// 后序遍历(左右根)
void postOrderTraversal(Node* root) {
if (root != NULL) {
postOrderTraversal(root->left); // 递归遍历左子树
postOrderTraversal(root->right); // 递归遍历右子树
printf("%d ", root->data); // 访问根节点
}
}
// 释放二叉树内存(后序遍历方式释放,避免内存泄漏)
void freeTree(Node* root) {
if (root != NULL) {
freeTree(root->left);
freeTree(root->right);
free(root);
}
}
int main() {
// 手动构建示例二叉树(对应前文示例结构)
// 1
// / \
// 2 3
// /
// 4
Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->right->left = createNode(4);
printf("前序遍历结果:");
preOrderTraversal(root); // 输出:1 2 3 4
printf("\n");
printf("中序遍历结果:");
inOrderTraversal(root); // 输出:2 1 4 3
printf("\n");
printf("后序遍历结果:");
postOrderTraversal(root); // 输出:2 4 3 1
printf("\n");
// 释放二叉树内存
freeTree(root);
return 0;
}