C++垂直输出二叉树的完整代码
时间: 2025-01-06 18:50:00 浏览: 1
在C++中,垂直(也称为层次)输出二叉树通常通过先序遍历和队列来实现。以下是一个简单的示例,展示了如何使用递归和非递归的方式垂直打印二叉树:
### 递归实现(Preorder Traversal + Queue)
```cpp
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 递归版本,辅助函数用于打印节点
void printTree(TreeNode* root, int level = 0, string spaces = "") {
if (root == nullptr) return;
cout << spaces << "Level " << level << ": " << root->val << endl; // 垂直输出节点值
printTree(root->right, level + 1, spaces + " "); // 先右后左
printTree(root->left, level + 1, spaces); // 左右平衡
}
// 非递归版本
void verticalPrint(TreeNode* root) {
if (root == nullptr) return;
queue<pair<TreeNode*, int>> q; // 使用队列存储节点及其层级
q.push({root, 0});
while (!q.empty()) {
int levelSize = q.size();
for (int i = 0; i < levelSize; ++i) {
pair<TreeNode*, int> nodeInfo = q.front();
q.pop();
cout << "Level " << nodeInfo.second << ": " << nodeInfo.first->val << endl;
if (nodeInfo.first->left != nullptr)
q.push({nodeInfo.first->left, nodeInfo.second + 1});
if (nodeInfo.first->right != nullptr)
q.push({nodeInfo.first->right, nodeInfo.second + 1});
}
}
}
```
### 相关问题--
1. 这段代码为什么需要两个不同的函数(递归和非递归)来实现垂直打印?
2. 在递归版本中,为什么要先输出`root->right`再`root->left`?
3. 如果二叉树为空,这两个版本的函数会怎样处理?
阅读全文