数据结构作业——brothers(二叉树)
brothers
Description
给你一棵节点编号从 1 到 n 的,根节点为 1 的二叉树。然后有 q 个询问,每个询问给出一个整数表示树的节点,要求这个节点的兄弟节点数目和堂兄弟节点
的数目。如下给出定义:兄弟节点:父节点相同的互为兄弟节点;堂兄弟节点:双亲在同一层的节点互为堂兄弟节点(要求双亲编号不同)。
Input
输入第一行为一个正整数 n 表示树的节点数目。从第 2 行到第 n+1 行,每行两个整数 l,r,分别表示编号为 i(i 从 1 到 n)的节点的左右儿子,0 表示没有儿子节点。接下来一行有一个整数 q,表示询问数目。紧接着 q 行,每行一个整数,表示要询问的节点。
30%的数据:n<=20,q<=10;
60%的数据:n<=1000,q<=n;
100%的数据:n<=100000,q<=n;
Output
输出 q 行,每行两个数,第一个数表示兄弟节点数目,第二个数表示堂兄弟节点数目。
Sample Input
8
2 3
4 0
5 7
0 8
6 0
0 0
0 0
0 0
3
4
5
6
Sample Output
0 2
1 1
0 1
思路
根据给出的每个节点的左右儿子建树,然后宽搜,给每一层编号,存储每一层各有什么节点,这样就可以很容易判断其兄弟节点以及堂兄弟节点的个数了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; const int maxn = 100005; struct Tree{ int lson,rson; Tree():lson(0),rson(0){} }tree[maxn]; vector< int >itv[maxn]; int fa[maxn],hei[maxn]; void bfs( int st) { int cnt = 1; queue< int >que,tque; que.push(st); while (!que.empty()) { while (!que.empty()) { int tmp = que.front(); que.pop(); hei[tmp] = cnt; itv[cnt].push_back(tmp); if (tree[tmp].lson) tque.push(tree[tmp].lson); if (tree[tmp].rson) tque.push(tree[tmp].rson); } if (tque.empty()) return ; cnt++; while (!tque.empty()) { que.push(tque.front()); tque.pop(); } } } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int n,q,lson,rson,i; scanf ( "%d" ,&n); for (i = 1;i <= n;i++) { scanf ( "%d%d" ,&lson,&rson); tree[i].lson = lson,tree[i].rson = rson; fa[lson] = i,fa[rson] = i; } bfs(1); scanf ( "%d" ,&q); while (q--) { int x = 0; scanf ( "%d" ,&n); if (tree[fa[n]].lson && tree[fa[n]].rson) x = 1; n = itv[hei[n]].size(); printf ( "%d %d\n" ,x,n - x - 1); } return 0; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)