题目求助!洛谷P1185题绘制二叉树

我的代码

9个测试点中,7和9过不了,又不给测试的数据,不知道哪里错了要怎么修改代码。

我的思路:

1.用一个二维数组,先构建完整的二叉树

2.删除节点

  • 删除节点分为两部分:1)删除父节点与节点之间的边;2)删除从节点开始的所有节点和边
    问AI,AI也给不出哪里有问题,只能求助博客园的各位大佬了/_ \
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int m, n, WIDTH, HEIGHT;
vector<vector<char>> tree(800, vector<char>(1600, ' '));

// 构建二叉树
void build(int f, int y, int t)
{
    if (t >= m) return;

    tree[f][y] = 'o';

    int height = pow(2, m-2-t) * 3 / 2 - 1;
    if (height == 0) height = 1;
    int balance = 1;
    for (int i = 0; i < height; i++)
    {
        tree[f+balance][y-balance] = '/';
        tree[f+balance][y+balance] = '\\';
        balance++;
    }

    int newf = f + height + 1, newly = y - balance, newry = y + balance;
    build(newf, newly, t+1);
    build(newf, newry, t+1);
}

// 删除节点
void remove(int f, int y, int t)
{
    if (t >= m || tree[f][y] != 'o') return;

    tree[f][y] = 'O';

    int height = pow(2, m-2-t) * 3 / 2 - 1;
    if (height == 0) height = 1;
    int balance = 1;
    for (int i = 0; i < height; i++)
    {
        tree[f+balance][y-balance] = ' ';
        tree[f+balance][y+balance] = ' ';
        balance++;
    }

    int newf = f + height + 1, newly = y - balance, newry = y + balance;
    remove(newf, newly, t+1);
    remove(newf, newry, t+1);
}

int main()
{
    cin >> m >> n;
    
    WIDTH = pow(2, m-1) * 3, HEIGHT = 0;
    switch (m)
    {
        case 2: HEIGHT = 1; break;
        case 3: HEIGHT = 3; break;
        case 4: HEIGHT = 8; break;
        case 5: HEIGHT = 19; break;
        case 6: HEIGHT = 42; break;
        case 7: HEIGHT = 89; break;
        case 8: HEIGHT = 184; break;
        case 9: HEIGHT = 375; break;
        case 10: HEIGHT = 785; break;
    }
    HEIGHT += m;

    int dy = pow(2, m-2) * 3;
    build(0, dy, 0);

    for (int i = 0; i < n; i++)
    {
        int a, b;
        cin >> a >> b;

        int tx = 0, ty = 0;
        int arr[9] = {1, 2, 5, 11, 23, 47, 95, 191, 383};
        for (int i = m; i > m-a+2; i--) tx += arr[i-2];
        tx += a - 2;

        int cnt = 0, x = tx + arr[m-a] + 1, y = 1;
        for (int j = 1; j < 1600; j++)
        {
            if (tree[x][j] == 'o' || tree[x][j] == 'O') cnt++;
            if (cnt == b)
            {
                y = j;
                break;
            }
        }

        if (b % 2) ty = y + (x - tx);
        else ty = y - (x - tx);
        // 清理父节点剩余的边
        int pre = a - 1, height = 0, balance = 1;
        height = pow(2, m-1-pre) * 3 / 2 - 1;
        if (height == 0) height = 1;
        for (int i = 0; i < height; i++)
        {
            if (b % 2) tree[tx+balance][ty-balance] = ' ';
            else tree[tx+balance][ty+balance] = ' ';
            balance++;
        }
        // 删除节点
        remove(x, y, a-1);
    }

    for (int i = 0; i < HEIGHT; i++)
    {
        for (int j = 1; j < WIDTH; j++)
            if (tree[i][j] == 'O') cout << ' ';
            else cout << tree[i][j];
        cout << endl;
    }
    return 0;
}

文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!