先序遍历、中序遍历和后序遍历是二叉树遍历的三种基本方式。
先序遍历(Preorder Traversal):首先访问根节点,然后按照先序遍历的方式递归访问左子树,最后递归访问右子树。
中序遍历(Inorder Traversal):首先按照中序遍历的方式递归访问左子树,然后访问根节点,最后递归访问右子树。
后序遍历(Postorder Traversal):首先按照后序遍历的方式递归访问左子树,然后递归访问右子树,最后访问根节点。
这三种遍历方式可以应用于任何类型的树,但在二叉树中最为常见。
以一个二叉树的例子来说明这三种遍历方式:
A
/ \
B C
/ \ \
D E F
先序遍历:A -> B -> D -> E -> C -> F
中序遍历:D -> B -> E -> A -> C -> F
后序遍历:D -> E -> B -> F -> C -> A
以下是使用 C 语言实现先序遍历、中序遍历和后序遍历的示例代码:
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点定义
struct Node {
int data;
struct Node* left;
struct Node* right;
};
// 创建新结点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 先序遍历
void preorderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历
void inorderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
int main() {
// 创建示例二叉树
struct Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->right = createNode(6);
printf("Preorder Traversal: ");
preorderTraversal(root);
printf("\n");
printf("Inorder Traversal: ");
inorderTraversal(root);
printf("\n");
printf("Postorder Traversal: ");
postorderTraversal(root);
printf("\n");
return 0;
}
在示例代码中,我们首先定义了一个二叉树结点 Node,包含一个整数 data 和左右子树的指针。然后,我们使用 createNode 函数创建了一个示例二叉树。
接下来,我们实现了 preorderTraversal、inorderTraversal 和 postorderTraversal 函数,分别用于先序遍历、中序遍历和后序遍历。这些函数使用递归的方式遍历二叉树,并打印每个结点的数据。
最后,在 main 函数中,我们调用这些遍历函数来遍历示例二叉树,并打印遍历结果。