2020年团体程序设计天梯赛 L2-3 完全二叉树的层序遍历

思路:

水题,略过

Tip:

满二叉树和完全二叉树的性质

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1000 + 5;

struct point {
    int num;
    point *left;
    point *right;
};
int ceng[maxn];
int a[maxn];
int nowP = 1;
int n;

point *dfs(point *now, int nowCeng) {
    if (!ceng[nowCeng])
        return NULL;
    ceng[nowCeng]--;
    now = (point *) malloc(sizeof(point));
    now->left = NULL;
    now->right = NULL;
    now->left = dfs(now->left, nowCeng + 1);
    now->right = dfs(now->right, nowCeng + 1);
    now->num = a[nowP++];
    return now;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int i, j = 1, ans = 0;
    for (i = 1;; i *= 2, j++) {
        if (ans + i > n) {
            ceng[j] = n - ans;
            break;
        }
        ceng[j] = i;
        ans += i;
    }
    point *head;
    head = dfs(head, 1);
    queue<point *> que;
    que.push(head);
    vector<int> v;
    while (!que.empty()) {
        point *now = que.front();
        que.pop();
        v.push_back(now->num);
        if (now->left != NULL)
            que.push(now->left);
        if (now->right != NULL)
            que.push(now->right);
    }
    bool first = true;
    for (auto k:v) {
        if (first) {
            first = false;
            cout << k;
        } else
            cout << " " << k;
    }
    return 0;
}

  

posted @ 2020-11-29 15:43  Whiteying  阅读(214)  评论(0编辑  收藏  举报