树的前序、中序和后序遍历是树的三种基本遍历方式,它们分别对树的节点进行不同的访问顺序。下面我会举例说明这三种遍历方式。
假设有如下二叉树:
1
/ \
2 3
/ \
4 5
-
前序遍历(Preorder Traversal):首先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。树的前序遍历结果为:1 2 4 5 3。
-
中序遍历(Inorder Traversal):先递归地对左子树进行中序遍历,然后访问根节点,最后递归地对右子树进行中序遍历。树的中序遍历结果为:4 2 5 1 3。
-
后序遍历(Postorder Traversal):先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问根节点。树的后序遍历结果为:4 5 2 3 1。
现在,让我们使用 C++ 代码来实现这三种遍历:
#include <iostream>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 前序遍历
void preorderTraversal(TreeNode* root) {
if (root == nullptr) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历
void inorderTraversal(TreeNode* root) {
if (root == nullptr) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(TreeNode* root) {
if (root == nullptr) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
int main() {
// 构建二叉树
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
// 前序遍历结果
cout << "前序遍历结果:";
preorderTraversal(root);
cout << endl;
// 中序遍历结果
cout << "中序遍历结果:";
inorderTraversal(root);
cout << endl;
// 后序遍历结果
cout << "后序遍历结果:";
postorderTraversal(root);
cout << endl;
return 0;
}
运行上述代码,将输出二叉树的前序、中序和后序遍历结果。