层序遍历建立树

https://www.kamacoder.com/problempage.php?pid=1051

#include <bits/stdc++.h>
using namespace std;

int k, n;

struct node {
    int val;
    node* left;
    node* right;
    node(int val) : val(val), left(nullptr), right(nullptr){}
    // static void* operator new(size_t n) {
    //     k = (node*)malloc(sizeof(node)*n);
    // }
    // ~node() {
    //     delete k;
    // }
    // static node* k;
};

//node* node::k = nullptr;



node* CreatTree(vector<int>& ve) {
    queue<node*> qu;
    node* root = new node(ve[0]);
    int i = 1;
    qu.push(root);
    while (!qu.empty() && i < ve.size()) {
        node* top = qu.front();
        qu.pop();

        if (top->val == -1) {
            continue;
        }

        if (i < ve.size()) {
            node* left = new node(ve[i++]);
            top->left = left;
            qu.push(left);
        }
        if (i < ve.size()) {
            node* right = new node(ve[i++]);
            top->right = right;
            qu.push(right);
        }
    }
    return root;
}

void Move_k(vector<node*>& vec, int k)
{
    vector<node*> temp(vec.begin(), vec.end());
    for(int i = 0;i < vec.size();i++)
        vec[(i+k) % (vec.size())] = temp[i];
}

int main () {
    cin >> k >> n;
    vector<int> ve(n);
    for(int i = 0; i < n; i++) {
        cin >> ve[i];
    }
    node* root = CreatTree(ve);
    
    queue<node*> qu;
    qu.push(root);
    while (!qu.empty()) {
        int size = qu.size();
        vector<node*> vec(size);
        for (int i = 0; i < size; i++) {
            vec[i] = qu.front();
            qu.pop();
        }
        Move_k(vec, k);
        for(int i = 0;i < size;i++)
        {
            cout << vec[i]->val << " ";
            if(vec[i]->left)
                qu.push(vec[i]->left);
            if(vec[i]->right)
                qu.push(vec[i]->right);
        }
    }

    return 0;
}
posted @ 2024-07-09 00:03  铜锣湾陈昊男  阅读(4)  评论(0)    收藏  举报