1115 Counting Nodes in a BST (30分)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
The left subtree of a node contains only nodes with keys less than or equal to the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
Insert a sequence of numbers into an initially empty binary search tree. Then you are supposed to count the total number of nodes in the lowest 2 levels of the resulting tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000) which is the size of the input sequence. Then given in the next line are the N integers in [−1000,1000] which are supposed to be inserted into an initially empty binary search tree.
Output Specification:
For each case, print in one line the numbers of nodes in the lowest 2 levels of the resulting tree in the format:
n1 + n2 = n
where n1 is the number of nodes in the lowest level, n2 is that of the level above, and n is the sum.
Sample Input:
9
25 30 42 16 20 20 35 -5 28
Sample Output:
2 + 4 = 6
题解:
建立二叉搜索树,bfs搜,最后判断最小的层数是否只有一层。
#include <bits/stdc++.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define ms(x, n) memset(x, n, sizeof(x))
#define wht() \
int _; \
for (scanf("%d", &_); _; _--)
#define For(i, a, b) for (int i = a; i <= (b); i++)
#define Rof(i, a, b) for (int i = a; i >= (b); i--)
#define ioss ios::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define int long long
#define input(x) scanf("%lld", &x);
#define print(x) printf("%lld", x);
#define println(x, flag) \
printf("%lld", x); \
printf(!flag ? "\n" : " ");
typedef vector<int> vi;
typedef pair<int, int> pii;
const int maxn = 2e6 + 7;
const int maxm = 5e3 + 7;
const int MOD = 1e9 + 7;
const int mod = 998244353;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
bool cmp(int a, int b) { return a > b; }
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right)
: val(x), left(left), right(right) {}
};
const int N = 1e4 + 5;
int n, m, k;
int f[N], g[N];
void build(TreeNode *&r, int val) {
if (r == nullptr) {
r = new TreeNode;
r->val = val;
r->left = r->right = nullptr;
return;
}
int u = val, v = r->val;
// cout << u << " " << v << "\n";
if (u > v) {
build(r->right, val);
} else {
build(r->left, val);
}
}
vector<int> pre;
void predfs(TreeNode *r) {
if (r == nullptr) return;
pre.push_back(r->val);
predfs(r->left);
predfs(r->right);
}
vi tot;
vector<int> bfs;
void Bfs(TreeNode *r) {
queue<pair<TreeNode *, int> > q;
q.push({r,1});
while (!q.empty()) {
int x = q.size();
int ceng;
For(i,1,x){
pair<TreeNode *, int> c = q.front();
TreeNode *cur = c.first;
ceng = c.second;
q.pop();
bfs.push_back(cur->val);
if (cur->left != nullptr) q.push({cur->left, ceng+1});
if (cur->right != nullptr) q.push({cur->right, ceng+1});
}
tot.push_back(x);
}
}
void work() {
cin >> n;
For(i, 1, n) { cin >> f[i]; }
// cout << u << "\n";
TreeNode *root = nullptr;
For(i, 1, n) { build(root, f[i]); }
Bfs(root);
int fir = 0;
// for(auto i : tot){cout<<i<<"\n";}
if(tot.size() == 1){
printf("%lld + 0 = %lld",tot.back(),tot.back());
}
else{
int lowest = tot.back();
tot.pop_back();
int seclowest = tot.back();
printf("%lld + %lld = %lld",lowest, seclowest,lowest+seclowest );
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
work();
}