用中序遍历创建树,并按照层序遍历输出
PS:看了柳的代码后,感觉“人与人之间的差距真的比人与……”
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int arr[1010];
int N;
struct node {
int val;
node* lChild;
node* rChild;
};
int getRootIndex(int left, int right) {
int root;
int remain = right - left + 1;
int level_node = 1;
while (remain > level_node) {
remain -= level_node;
level_node *= 2;
}
if (remain > level_node / 2) {
root = level_node - 1 + left;
} else {
root = level_node / 2 - 1 + remain + left;
}
return root;
}
node* createTree(node* root, int left, int right) {
// 利用中序遍历构造树
if (left > right) {
return NULL;
}
if (root == NULL) {
root = new node;
root->lChild = root->rChild = NULL;
}
int root_index = getRootIndex(left, right);
root->val = arr[root_index];
root->lChild = createTree(root->lChild, left, root_index - 1);
root->rChild = createTree(root->rChild, root_index + 1, right);
return root;
}
// 层序遍历输出root
vector<vector<int>> levels;
int max_level = 0;
void dfs(node* root, int level) {
if (root == NULL) return;
if (level > max_level) {
max_level = level;
}
levels[level].push_back(root->val);
dfs(root->lChild, level+1);
dfs(root->rChild, level+1);
}
int main() {
cin >> N;
levels.resize(20);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N);
// 寻找根节点
node* root = NULL;
root = createTree(root, 0, N - 1);
dfs(root, 0);
bool flag = true;
for (int i = 0; i <= max_level; i++) {
for (auto item: levels[i]) {
if (flag != true) {
cout << " ";
} else {
flag = false;
}
cout << item;
}
}
cout << endl;
return 0;
}