P3884 [JLOI2009]二叉树问题

题目描述

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

深度: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

题目类型:bfs, dfs,寻找最近公共祖先

解题思路:创建四元树节点

struct node{
    int d;
    int father;
    int l, r;
}tree[NC];

        1)常规bfs, 常规dfs;

        2)最近公共祖先:先把两个结点中较深的结点沿着寻找父节点的方法,到同一深度层上;

               再一起向上寻找父节点,直到父节点相同,跳出,将当前父节点记录为公共父节点即cfather。

        3)cfather分别减去之前两个结点的深度再乘上对应的权值,即可。

注意点:bfs宽度指(同一层最多结点个数)。

                要在寻找最近公共祖先时要 先把每个结点的深度关于父节点的深度-1来初始化一遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值