题意:给你一堆数,问按序插入一颗空的BST后,最后两层的节点个数的和是多少。
思路:模拟二叉搜索树的插入,lch和rch分别记录左右孩子动态开点,另外开个val数组记录每个结点的值。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1e5+5;
int lch[maxn], rch[maxn], val[maxn], n;
int lev[maxn];
struct node
{
int x, l;
node(){}
node(int xx, int ll): x(xx), l(ll) {}
};
void solve()
{
memset(lev, 0, sizeof(lev));
queue<node> q;
q.push(node(0, 1));
node u;
while(!q.empty())
{
u = q.front(); q.pop();
lev[u.l]++;
if(lch[u.x] != -1) q.push(node(lch[u.x], u.l+1));
if(rch[u.x] != -1) q.push(node(rch[u.x], u.l+1));
}
printf("%d + %d = %d\n", lev[u.l], lev[u.l-1], lev[u.l]+lev[u.l-1]);
}
int main(void)
{
while(cin >> n)
{
memset(lch, -1, sizeof(lch));
memset(rch, -1, sizeof(rch));
int cur = 0;
int x;
scanf("%d", &x);
val[cur++] = x;
for(int i = 2; i <= n; i++)
{
scanf("%d", &x);
int tmp = 0;
while(1)
{
if(x <= val[tmp])
{
if(lch[tmp] == -1)
{
lch[tmp] = cur;
val[cur++] = x;
break;
}
else
tmp = lch[tmp];
}
else
{
if(rch[tmp] == -1)
{
rch[tmp] = cur;
val[cur++] = x;
break;
}
else
tmp = rch[tmp];
}
}
}
solve();
}
return 0;
}