求二叉树中节点间的宽度
题目描述
如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:
深度: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间距离。
可以先把这道题分解成3个小问题:
1:求二叉树的深度
每一个子结点的深度都是它父亲节点的深度+1(一号结点的深度是1)
for(int i = 1;i < n;i++)
{ //循环是到n - 1,按照题目要求,前n - 1行才是需要的
cin >> root[i] >> son[i];
depth[son[i]] = depth[root[i]] + 1; //子结点的深度是父亲结点的深度 + 1
fa[son[i]] = root[i]; //一个结点的父亲结点是它本身
}
int max_depth = 1; //用于记录深度
for(int i = 1;i <= n;i++)
{
max_depth = max(max_depth,depth[i]);//记录深度
width[depth[i]]++; //记录每层的结点数,为下面求宽度
}
2:求二叉树的宽度
int max_width = 1;
for(int i = 1;i <= n;i++)
{
max_width = max(max_width,width[i]);
}
3:求给定两个结点间距离
求两个结点的最近公共祖先 LCA
int lca(int x,int y)
{
if(x == y)
{
return x; //两个点如果相同,那么 LCA 就是它本身
}
else if(depth[x] == depth[y])
{
return lca(fa[x],fa[y]); //如果两个点深度相同,就访问它们的父亲结点
}
else if(depth[x] < depth[y])
{
return lca(x,fa[y]); //如果x的深度小于y的深度,就访问y的父亲结点,直到x y 深度相同
}
else
{
return lca(fa[x],y); //原理大致和上一种情况相同
}
}
完整代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int fa[101],root[101],son[101];
int depth[101],width[101];
int lca(int x,int y)
{
if(x == y){
return x;
}
else if(depth[x] == depth[y]){
return lca(fa[x],fa[y]);
}
else if(depth[x] < depth[y]){
return lca(x,fa[y]);
}
else{
return lca(fa[x],y);
}
}
int main()
{
cin >> n;
depth[1] = 1;
for(int i = 1;i < n;i++)
{
cin >> root[i] >> son[i];
depth[son[i]] = depth[root[i]] + 1;
fa[son[i]] = root[i];
}
int x,y;
cin >> x >> y;
int max_depth = 1;
for(int i = 1;i <= n;i++)
{
max_depth = max(max_depth,depth[i]);
width[depth[i]]++;
}
cout << max_depth << endl;
int max_width = 1;
for(int i = 1;i <= n;i++)
{
max_width = max(max_width,width[i]);
}
cout << max_width << endl;
int k = lca(x,y); //求 LCA 的结点序号,记录最小公共祖先
cout << (depth[x] - depth[k]) * 2 + depth[y] - depth[k]; //求距离
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】