3022: 【普及/提高-】【P3884】二叉树问题
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:2
解决:2
题目描述
如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:
- 深度:
- 宽度:
- 结点 8 和 6 之间的距离:
- 结点 7 和 6 之间的距离:
其中宽度表示二叉树上同一层最多的结点个数,节点 之间的距离表示从 到 的最短有向路径上向根节点的边数的两倍加上向叶节点的边数。
给定一颗以 1 号结点为根的二叉树,请求出其深度、宽度和两个指定节点 之间的距离。
输入
第一行是一个整数,表示树的结点个数 。
接下来 行,每行两个整数 ,表示树上存在一条连接 的边。
最后一行有两个整数 ,表示求 之间的距离。
接下来 行,每行两个整数 ,表示树上存在一条连接 的边。
最后一行有两个整数 ,表示求 之间的距离。
输出
输入三行,每行一个整数,依次表示二叉树的深度、宽度和 之间的距离。
样例输入 复制
10
1 2
1 3
2 4
2 5
3 6
3 7
5 8
5 9
6 10
8 6
样例输出 复制
4
4
8
提示
对于全部的测试点,保证 ,且给出的是一棵树。
#include<bits/stdc++.h> using namespace std; struct node { int left,right,father,depth; }ns[105]; struct node2{ int pos,step; }; int deep,wide,width[105],visited[105]; void dfs(int pos) { if(visited[pos]) return; visited[pos] = 1; int left=ns[pos].left,right=ns[pos].right,depth=ns[pos].depth; deep=max(deep,depth); width[depth]++; if(left) { ns[left].depth=depth+1; dfs(left); } if(right) { ns[right].depth=depth+1; dfs(right); } } int main(){ int n,u,v,x,y; cin>>n; for(int i=1;i<n;i++) { cin>>u>>v; if(!ns[ u ].left) ns[ u ].left=v; else ns[ u ].right=v; ns[v].father=u; } cin>>x>>y; ns[1].depth=1; dfs(1); for(int i=1;i<=n;i++) wide=max(wide,width[i]); cout<<deep<<endl<<wide<<endl; memset(visited,0,sizeof(visited)); node2 tn={x,0}; visited[x]=1; queue<node2> q; q.push(tn); while(!q.empty()) { tn=q.front(); q.pop(); if(tn.pos==y) { cout<<tn.step; break; } int left=ns[tn.pos].left,right=ns[tn.pos].right,father=ns[tn.pos].father,step=tn.step; if(left && !visited[left]) { visited[left]=1; q.push({left,step+1}); } if(right && !visited[right]) { visited[right]=1; q.push({right,step+1}); } if(father && !visited[father]) { visited[father]=1; q.push({father,step+2}); } } return 0; }