PAT (Advanced Level) Practice 1115 Counting Nodes in a BST (30分)建树+bfs

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值