今日学习总结

今天还是写题的一天。上代码吧。

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;

今天的题目让我学会了如何计算二叉树的深度。每天进步一点点,加油!

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值