如何用C++实现二叉树的中序遍历、层次遍历(即广度优先搜索)并分别输出先序遍历和后续遍历的结果?
时间: 2024-12-11 12:24:12 浏览: 28
在C++中,我们可以使用递归或栈来实现二叉树的遍历。这里我会提供一种基于递归的方式以及广度优先搜索(BFS)的方式,并分别给出先序遍历和后序遍历。
**1. 中序遍历(递归实现):**
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
void inorderTraversal(TreeNode* root, std::vector<int>& result) {
if (root == nullptr) return;
inorderTraversal(root->left, result);
result.push_back(root->val); // 访问节点值
inorderTraversal(root->right, result);
}
```
**2. 广度优先搜索(BFS实现):**
```cpp
void levelOrder(TreeNode* root, std::vector<std::vector<int>>& result) {
if (root == nullptr) return;
std::queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
result.push_back({node->val}); // 存储当前层的节点值
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
```
**3. 先序遍历(递归实现):**
先序遍历通常是根节点 -> 左子树 -> 右子树。代码类似中序遍历,只是访问顺序调整一下:
```cpp
void preorderTraversal(TreeNode* root, std::vector<int>& result) {
if (root == nullptr) return;
result.push_back(root->val);
preorderTraversal(root->left, result);
preorderTraversal(root->right, result);
}
```
**4. 后序遍历(递归实现):**
后序遍历是左子树 -> 右子树 -> 根节点。可以使用辅助函数来保存中间结果:
```cpp
std::vector<int> helper(TreeNode* root) {
if (root == nullptr) return {};
std::vector<int> left = helper(root->left);
std::vector<int> right = helper(root->right);
return (left.size() > right.size() ? left : right) + {root->val} + (left.size() < right.size() ? left : right);
}
void postorderTraversal(TreeNode* root, std::vector<int>& result) {
result = helper(root);
}
```
阅读全文