P3884 [JLOI2009]二叉树问题 【二叉树】

    科技2022-07-11  119

    题目描述

    如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:

    深度:4 宽度:4(同一层最多结点个数)

    结点间距离: ⑧→⑥为8 (3×2+2=8)

    ⑥→⑦为3 (1×2+1=3)

    注:结点间距离的定义:由结点向根方向(上行方向)时的边数×2,

    与由根向叶结点方向(下行方向)时的边数之和。

    输入格式

    输入文件第一行为一个整数n(1≤n≤100),表示二叉树结点个数。接下来的n-1行,表示从结点x到结点y(约定根结点为1),最后一行两个整数u、v,表示求从结点u到结点v的距离。 输出格式

    三个数,每个数占一行,依次表示给定二叉树的深度、宽度及结点u到结点v间距离。 输入输出样例 输入 #1

    10 1 2 1 3 2 4 2 5 3 6 3 7 5 8 5 9 6 10 8 6

    输出 #1

    4 4 8

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 130; int fa[maxn]; int n; int dep[maxn]; int len[maxn]; int main() { int depth = 0, length = 0; cin >> n; int u, v; dep[1] = 1; for(int i = 1; i < n; i++) { cin >> u >> v; fa[v] = u; dep[v] = dep[u] + 1; len[dep[v]]++; depth = max(depth, dep[v]); length = max(length, len[dep[v]]); } cin >> u >> v; int u_step = 0, v_step = 0; while(u != v) { if(dep[u] == dep[v]) { u = fa[u], v = fa[v]; u_step++, v_step++; } else if(dep[u] > dep[v]) { u = fa[u]; u_step++; } else { v = fa[v]; v_step++; } } cout << depth << endl << length << endl; cout << u_step * 2 + v_step; return 0; }
    Processed: 0.008, SQL: 8