• PAT 1064 Complete Binary Search Tree


     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 }

    又是跟书本比较近的一题

  • 相关阅读:
    python中的内置函数的思维导图
    练习(面试题):关于生成器函数的求和问题
    推导式, 生成器表达式
    生成器
    静态代码块
    java中内存的划分
    静态方法
    Chapter07Scanner类、Random类、ArrayList类
    泛型
    对象数组
  • 原文地址:https://www.cnblogs.com/lailailai/p/3996186.html
Copyright © 2020-2023  润新知