如何在C++中使用头文件实现先序遍历和中序遍历来构造后序遍历的过程?
时间: 2024-12-14 19:25:56 浏览: 10
在C++中,通过头文件(header files)来组织和复用代码,我们可以定义一个包含树结构和遍历函数的公共模块。首先,我们定义一个`TreeNode`结构体表示二叉树节点,接着编写函数来处理先序(Preorder)、中序(Inorder)和后序(Postorder)遍历。
1. 首先,在一个名为`tree_traversal.h`的头文件中:
```cpp
#ifndef TREE_TRAVERSAL_H
#define TREE_TRAVERSAL_H
#include <iostream>
#include <vector>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
std::vector<int> preOrderTraversal(TreeNode* root); // 先序遍历函数声明
std::vector<int> inOrderTraversal(TreeNode* root); // 中序遍历函数声明
// 后序遍历实现依赖于先序和中序,因此在这里暂不提供直接的实现
std::vector<int> postOrderTraversal(TreeNode* root); // 后序遍历函数声明
#endif // TREE_TRAVERSAL_H
```
2. 然后,在`tree_traversal.cpp`的源文件中,我们提供函数的具体实现:
```cpp
#include "tree_traversal.h"
// 先序遍历实现
std::vector<int> preOrderTraversal(TreeNode* root) {
std::vector<int> result;
if (root) {
result.push_back(root->val);
result.insert(result.end(), preOrderTraversal(root->left).begin(), preOrderTraversal(root->left).end());
result.insert(result.end(), preOrderTraversal(root->right).begin(), preOrderTraversal(root->right).end());
}
return result;
}
// 中序遍历实现
std::vector<int> inOrderTraversal(TreeNode* root) {
std::vector<int> result;
if (root) {
result.insert(result.end(), inOrderTraversal(root->left).begin(), inOrderTraversal(root->left).end());
result.push_back(root->val);
result.insert(result.end(), inOrderTraversal(root->right).begin(), inOrderTraversal(root->right).end());
}
return result;
}
// 实现后序遍历
std::vector<int> postOrderTraversal(TreeNode* root) {
if (!root) return {};
std::vector<int> post_left = postOrderTraversal(root->left);
std::vector<int> post_right = postOrderTraversal(root->right);
// 使用栈来模拟后序遍历过程
std::vector<int> result(post_left.rbegin(), post_left.rend());
result.insert(result.end(), post_right.begin(), post_right.end());
result.push_back(root->val);
return result;
}
```
3. 在主程序中,你可以像这样导入头文件并使用遍历函数:
```cpp
#include "tree_traversal.h"
int main() {
TreeNode* root = createBinaryTree(); // 创建二叉树
std::vector<int> preOrder = preOrderTraversal(root);
std::vector<int> inOrder = inOrderTraversal(root);
std::vector<int> postOrder = postOrderTraversal(root);
for (const auto &value : postOrder) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
```
阅读全文