我的代码
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;
}
文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!文字太少了投不到首页,凑字数!