洛谷 P4913【深基16.例3】二叉树深度

题目传送门: 【深基16.例3】二叉树深度 

 

/*
Takes:luogu
Title:P4913
Time:2025/1/15
*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define endl '\n'
// #pragma GCC optimize(2)

#define pii pair<int, int>
#define pdd pair<double, double>
#define psi pair<string, int>
#define be(x) x.begin(), x.end()
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)(x).size())

pii A[1000001];

int dfs(int c)
{
    if (A[c].first == 0 && A[c].second == 0)
        return 0;
    return max(dfs(A[c].first), dfs(A[c].second)) + 1;
}

void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> A[i].first >> A[i].second;
    cout << dfs(1) + 1 << endl;
}

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}

<think>好的,用户想了解的P4913题目。首先,我需要确认这道题的具体内容。的题目编号通常对应不同的题目,但用户没有提供题目名称,所以需要先查找P4913对应的题目。根据记忆,P4913是“二叉树深度”问题,可能涉及二叉树的结构和计算深度。 接下来,我要回忆这道题的要求。通常二叉树相关的题目可能要求构建二叉树,然后计算它的深度,或者处理某种特定的遍历方式。需要确定题目是给出二叉树的某种输入形式,比如节点间的连接关系,然后计算最大深度。 用户可能希望得到题目的解析和解题思路。因此,我需要分步骤解释如何解决这个问题。首先,题目可能输入的是每个节点的左右子节点编号,然后要求根据这些信息建立二叉树,并求出其最大深度。 考虑到数据结构,通常可以用结构体或数组来存储每个节点的左右孩子。比如,用一个数组tree,每个元素包含左孩子和右孩子的索引。然后,通过递归或迭代的方式遍历这棵树,计算最大深度。 需要解释具体的步骤:如何读取输入,如何存储二叉树结构,如何设计递归函数来计算深度。比如,递归函数可以对于每个节点返回其左右子树的最大深度加一,这样根节点的深度就是整个树的最大深度。 可能还需要注意输入的处理,比如节点数量n,然后是n行每行两个数表示左右子节点。需要处理节点不存在的情况,比如用0或-1表示空节点,这时候该子树的深度为0。 此外,可能需要考虑时间复杂度和空间复杂度是否在题目限制范围内。递归方法的时间复杂度是O(n),每个节点访问一次,应该是可行的。 最后,给出一个示代码框架,用C++或Python展示如何实现这个算法。比如,用数组存储节点,递归函数计算深度,并处理边界条件。 需要确保回答结构清晰,分步骤解释,帮助用户理解问题并自行实现代码。同时,注意使用中文,符合格式要求,数学表达式用$...$,独立公式用$$...$$。</think>让我们来详细解析P4913二叉树深度”问题: ### 题目概述 给定一个二叉树的节点连接关系,要求计算这棵二叉树的**最大深度**(即从根节点到最远叶子节点的最长路径上的节点数)。 --- ### 输入格式 1. 第一行为整数$n$,表示二叉树节点总数 2. 接下来$n$行,每行两个整数$l_i$和$r_i$,表示第$i$个节点的左、右子节点编号(0表示空节点) --- ### 解题思路 #### 步骤1:建立二叉树结构 使用数组存储每个节点的子节点信息: ```cpp struct Node { int l, r; }; Node tree[100001]; // 根据题目数据范围选择数组大小 ``` #### 步骤2:递归计算深度 定义递归函数`dfs(u)`: - 参数:当前节点编号`u` - 返回值:以`u`为根的子树的最大深度 - 递归终止条件:当`u=0`(空节点)时返回0 递推公式: $$ \text{depth}(u) = \max(\text{depth}(lchild), \text{depth}(rchild)) + 1 $$ #### 步骤3:时间复杂度分析 每个节点仅被访问一次,时间复杂度为$O(n)$,满足题目要求。 --- ### 示代码(C++) ```cpp #include <iostream> #include <algorithm> using namespace std; struct Node { int l, r; }; Node tree[100001]; int dfs(int u) { if(u == 0) return 0; return max(dfs(tree[u].l), dfs(tree[u].r)) + 1; } int main() { int n; cin >> n; for(int i=1; i<=n; ++i) cin >> tree[i].l >> tree[i].r; cout << dfs(1); // 从根节点(编号1)开始遍历 return 0; } ``` --- ### 关键点说明 1. **根节点确定**:题目默认节点编号1为根节点 2. **空节点处理**:当子节点编号为0时直接返回深度0 3. **递归实现**:通过后序遍历计算子树深度 4. **边界情况**:当n=0(空树)时深度为0,但题目保证$n \geq 1$ --- ### 测试案 输入: ``` 3 2 3 0 0 0 0 ``` 树结构: ``` 1 / \ 2 3 ``` 输出: ``` 2 ``` 通过这个解决方案,您可以高效地计算出任意二叉树的最大深度。实际编码时注意根据题目给出的数据范围调整数组大小。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值