题目描述
如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:
深度: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来初始化一遍