今天还是写题的一天。上代码吧。
P4913 【深基16.例3】二叉树深度
# 【深基16.例3】二叉树深度
## 题目描述
有一个 $n(n \le 10^6)$ 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 $n$),建立一棵二叉树(根节点的编号为 $1$),如果是叶子结点,则输入 `0 0`。
建好这棵二叉树之后,请求出它的深度。二叉树的**深度**是指从根节点到叶子结点时,最多经过了几层。
## 输入格式
第一行一个整数 $n$,表示结点数。
之后 $n$ 行,第 $i$ 行两个整数 $l$、$r$,分别表示结点 $i$ 的左右子结点编号。若 $l=0$ 则表示无左子结点,$r=0$ 同理。
## 输出格式
一个整数,表示最大结点深度。
## 样例 #1
### 样例输入 #1
```
7
2 7
3 6
4 5
0 0
0 0
0 0
0 0
```
### 样例输出 #1
```
4
``
思路
这个题目第一要做的是构建一个二叉树并将其输入。然后通过DFS不往下搜索。每一次搜索,深度都要加一,当搜索到的东西为0及没有左叉树或右叉树时停止。并且每一次都要比较大小,以此来更新它的深度。最后输出它的深度。
代码
#include<bits/stdc++.h>
using namespace std;
struct point{
int l,r;
}tree[1000002];
int anw=-1;
void dfs(int pos,int deep){
if(pos==0)return;
anw=max(deep,anw);
dfs(tree[pos].l,deep+1);
dfs(tree[pos].r,deep+1);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>tree[i].l>>tree[i].r;
}
dfs(1,1);
cout<<anw;
return 0;
}
P3367 【模板】并查集
# 【模板】并查集
## 题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
## 输入格式
第一行包含两个整数 $N,M$ ,表示共有 $N$ 个元素和 $M$ 个操作。
接下来 $M$ 行,每行包含三个整数 $Z_i,X_i,Y_i$ 。
当 $Z_i=1$ 时,将 $X_i$ 与 $Y_i$ 所在的集合合并。
当 $Z_i=2$ 时,输出 $X_i$ 与 $Y_i$ 是否在同一集合内,是的输出
`Y` ;否则输出 `N` 。
## 输出格式
对于每一个 $Z_i=2$ 的操作,都有一行输出,每行包含一个大写字母,为 `Y` 或者 `N` 。
## 样例 #1
### 样例输入 #1
```
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
```
### 样例输出 #1
```
N
Y
N
Y
```
## 提示
对于 $30\%$ 的数据,$N \le 10$,$M \le 20$。
对于 $70\%$ 的数据,$N \le 100$,$M \le 10^3$。
对于 $100\%$ 的数据,$1\le N \le 10^4$,$1\le M \le 2\times 10^5$,$1 \le X_i, Y_i \le N$,$Z_i \in \{ 1, 2 \}$。
思路
这这也是一个简单的并查集的题。在这一道题中,他说有n个元素因此我们需要将n个元素初始化及他的父亲等于他自身。然后要对输入的每一组数的第一个元素进行判断,如果他们的第一个元素为1,查找第二个元素和第三个元素的祖先是否相同,若不相同,则将其合并。我第一个元素为2,则查找第二个元素和第三个元素的祖先,若他们的祖先相同,则输出y,若他们的祖先不相同,则输出n。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,z,x,y;
int fa[1000000];
void init(int n){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}
int find(int i){
if(fa[i]==i){
return i;
}
else{
fa[i]=find(fa[i]);
return fa[i];
}
}
int main(){
cin>>n>>m;
init(n);
for(int i=1;i<=m;i++){
cin>>z>>x>>y;
if(z==1){
if(find(x)!=find(y)){
fa[find(y)]=find(x);
continue;
}
}
else if(z==2){
if(find(x)==find(y)){
cout<<"Y"<<endl;
}
else{
cout<<"N"<<endl;
}
}
}
return 0;
}
今天的题目让我学会了如何计算二叉树的深度。每天进步一点点,加油!