PAT 1064 Complete Binary Search Tree
11560 ワード
1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <vector>
5 #include <algorithm>
6
7 using namespace std;
8
9 class Node {
10 public:
11 int val;
12 Node* left;
13 Node* right;
14 public:
15 Node(): val(0), left(NULL), right(NULL) {}
16 Node(int _val, Node* _left = NULL, Node* _right = NULL): val(_val), left(_left), right(_right) {}
17 };
18
19 vector<Node*> build_next_level(vector<Node*> last_level, int &num) {
20 vector<Node*> res;
21 if (num < 1) return res;
22
23 for (auto iter = last_level.begin(); iter != last_level.end(); iter++) {
24 Node* parent = *iter;
25
26 Node* lchild = new Node();
27 res.push_back(lchild);
28 parent->left = lchild;
29 if (--num < 1) break;
30
31 Node* rchild = new Node();
32 res.push_back(rchild);
33 parent->right= rchild;
34 if (--num < 1) break;
35 }
36
37 return res;
38 }
39
40 void inorder_traverse(Node* root, int& order) {
41 if (root == NULL) return;
42 inorder_traverse(root->left, order);
43 root->val = order++;
44 inorder_traverse(root->right, order);
45 }
46
47 int main() {
48 int cnt;
49
50 scanf("%d", &cnt);
51
52 vector<int> nums(cnt, 0);
53
54 if (cnt < 1) return 0;
55
56 for (int i = 0; i<cnt; i++) {
57 int num = 0;
58 scanf("%d", &num);
59 nums[i] = num;
60 }
61 sort(nums.begin(), nums.end());
62
63 vector<vector<Node*> > levels;
64
65 vector<Node*> last_level;
66 last_level.push_back(new Node());
67
68 levels.push_back(last_level);
69
70 int node_cnt = cnt - 1; // we already pushed the root node
71 while (node_cnt > 0) {
72 vector<Node*> cur_level = build_next_level(last_level, node_cnt);
73 levels.push_back(cur_level);
74 swap(last_level, cur_level);
75 }
76
77 int order = 0;
78 inorder_traverse(levels[0][0], order);
79
80 node_cnt = cnt;
81
82 for (auto iter_levels = levels.begin(); iter_levels != levels.end(); iter_levels++) {
83 vector<Node*>& cur_level = *iter_levels;
84 for (auto iter = cur_level.begin(); iter != cur_level.end(); iter++) {
85 Node* node = *iter;
86 int val = nums[node->val];
87 if (--node_cnt > 0) {
88 printf("%d ", val);
89 } else {
90 printf("%d
", val); // last element
91 }
92 }
93 }
94 return 0;
95 }
また本に近い問題です