二叉树的前序、中序和后序遍历是三种常见的树遍历方法,三者的区别就在于根节点放在左右节点的前面、中间和后面。
每种遍历方法定义了访问节点(通常称为根节点、左子节点和右子节点)的顺序。下面将分别介绍这三种遍历方法,并给出例子。
1. 前序遍历(Pre-order Traversal)
前序遍历的访问顺序是:根节点 -> 左子树 -> 右子树。
例子: 给定二叉树:
A
/ \
B C
/ / \
D E F
前序遍历的顺序是:A, B, D, C, E, F。
2. 中序遍历(In-order Traversal)
中序遍历的访问顺序是:左子树 -> 根节点 -> 右子树。
例子: 给定二叉树:
A
/ \
B C
/ / \
D E F
中序遍历的顺序是:D, B, A, E, C, F。
3. 后序遍历(Post-order Traversal)
后序遍历的访问顺序是:左子树 -> 右子树 -> 根节点。
例子: 给定二叉树:
A
/ \
B C
/ / \
D E F
后序遍历的顺序是:D, B, E, F, C, A。
遍历过程的递归实现
以下是这三种遍历方法的递归实现(以 C++ 为例):
#include <iostream>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
// 前序遍历,递归方式
void preOrder(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历,递归方式
void inOrder(TreeNode* root) {
if (root == NULL) return;
inOrder(root->left);
cout << root->val << " ";
inOrder(root->right);
}
// 后序遍历,递归方式
void postOrder(TreeNode* root) {
if (root == NULL) return;
postOrder(root->left);
postOrder(root->right);
cout << root->val << " ";
}
int main() {
// 构建示例二叉树
TreeNode* root = new TreeNode('A');
root->left = new TreeNode('B');
root->right = new TreeNode('C');
root->left->left = new TreeNode('D');
root->right->left = new TreeNode('E');
root->right->right = new TreeNode('F');
// 执行遍历
cout << "Pre-order traversal: ";
preOrder(root);
cout << endl;
cout << "In-order traversal: ";
inOrder(root);
cout << endl;
cout << "Post-order traversal: ";
postOrder(root);
cout << endl;
return 0;
}
总结
-
前序遍历:根节点 -> 左子树 -> 右子树
-
中序遍历:左子树 -> 根节点 -> 右子树
-
后序遍历:左子树 -> 右子树 -> 根节点
这些遍历方法在树的算法中非常有用,例如在表达式树的计算、文件系统的目录遍历等场景中。