题解 P4913 【深基16.例3】二叉树深度

第一次写树有关的题解,如果有不严谨的地方望指正

首先让我们看题,题目说给出一棵树每个节点的儿子节点,如果是叶子节点就是0 0

那么我们就可以直接暴力存下这颗树了

开一个结构体,存当前节点的两个儿子

然后一个一个的遍历树的节点(这里数据小并不用任何优化和算法)

  • 开一个数组dep记录当前深度
  • 每一个儿子节点x得到深度,都是由它的父亲贡献而来的,每往下搜一个节点,这dep[son[x].l]就是由 dep[x] + 1贡献来的
  • 搜它的儿子节点

以上就是大概的思路了
注意:初始深度一定要设为1,因为树根也是一层

 

#include<bits/stdc++.h>
using namespace std;
int n, ans;
int dep[100101];//存深度的数组
struct fff{
    int l, r;
}son[1001010];//存左右儿子的结构体
void dfs (int x)
{
    if (x == 0) return;//输入说了叶子节点是0,然而节点编号并没有0,所以可以大胆的遇到0就返回
    dep[son[x].l] = dep[x] + 1;
    dfs (son[x].l);//搜它的左儿子
    dep[son[x].r] = dep[x] + 1;
    dfs (son[x].r);//搜它的右儿子

}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        int x, y;
        cin >> x >> y;
        son[i].l = x, son[i].r = y;
     }
    dep[1] = 1;//初始深度
    dfs(1);
    for (int i = 1; i <= n; i ++)
    ans = max(dep[i], ans);
    //最大深度肯定是从所有深度中得来的,打一遍擂台即可
    cout << ans;//输出答案
    return 0;
}

 

posted @ 2020-07-28 08:13  liujunxi  阅读(117)  评论(0编辑  收藏  举报