给定树的前序+中序遍历,按层输出
首先根据题目要求可以给出程序主函数的框架。题目要求如下:
- 输入:第一行输入整数n,表示树所有节点的个数。接下来两行分别为树前序和中序遍历的结果。
- 输出:按照树的按层遍历输出。
- 处理:由前序+中序建树
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Node {
int data;
struct Node* left;
struct Node* right;
Node(const int dt): data(dt), left(NULL), right(NULL){}
};
vector<Node> front; // 前序遍历结果
vector<Node> mid; // 中序遍历结果
struct Node* root; // 根节点
int n; // 树中节点个数
int j; // 前序遍历vector索引
int main() {
// input
cin >> n;
for (int i = 0; i < n; i++) {
int d;
cin >> d;
Node n = Node(d);
front.push_back(n);
}
for (int i = 0; i < n; i++) {
int d;
cin >> d;
Node n = Node(d);
mid.push_back(n);
}
// body
j = 0;
root = build(0, n - 1);
// output
bfs(root);
return 0;
}
该题属于抽象的数据结构问题,关键在于找到树的递归结构。**前序遍历顺序遍历可以将中序遍历划分为三部分:左子树、节点、右子树。**再将节点与左右子树的关系建立起来就完成了树的建立。
Node* build(int left, int right) {
Node* node = &front[j]; // 中间节点
if (left > right) {
return NULL;
}
else if (left == right) {
j++;
return node;
}
for (int i = left; i <= right; i++) {
if (mid[i].data == node->data) {
j++;
Node* ln = build(left, i - 1);
Node* rn = build(i + 1, right);
node->left = ln; // 建立与左子树联系
node->right = rn; // 建立与右子树联系
}
}
return node;
}
然后整一个bfs板子输出
void bfs(Node* root) {
queue<Node> level;
level.push(*root);
while (level.size() != 0) {
Node node = level.front();
cout << node.data << " ";
level.pop();
if (node.left != NULL) {
level.push(*node.left);
}
if (node.right != NULL) {
level.push(*node.right);
}
}
cout << endl;
}