洛谷:P1305 新二叉树

https://blog.csdn.net/SimonCoder

题目描述

输入一串二叉树,输出其前序遍历。

输入格式

第一行为二叉树的节点数 n。(1≤n≤26)

后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。

空节点用 * 表示

输出格式

二叉树的前序遍历。

输入输出样例

输入 #1

6
abc
bdi
cj*
d**
i**
j**

输出 #1

abdicj
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<iostream>
using namespace std;
struct BinTree{
    char data;
    BinTree *lchild, *rchild;
} *root;
BinTree* CreateTree(char bintree_index[][2], char head){
    if(head=='*') return NULL;
    BinTree* p;
    p = (BinTree *)malloc(sizeof(BinTree));
    p->data = head;
    p->lchild = CreateTree(bintree_index, bintree_index[head-'a'][0]);
    p->rchild = CreateTree(bintree_index, bintree_index[head-'a'][1]);
    return p;
}
void PreOrder(BinTree* head){
	if(head){
		printf("%c", head->data);
		PreOrder(head->lchild);
		PreOrder(head->rchild);
	}
}
void Release(BinTree* head){
	if(head){
		Release(head->lchild);
		Release(head->rchild);
		free(head);
	}
}

int main(){
    int n;
    char bintree_index[26][2];
    while(scanf("%d", &n)!=EOF){
        getchar(); // 吸收换行符
        char r;
        for(int i=0; i<n; i++)
        {
            char fa, lch, rch;
            //scanf("%c %c %c", &fa, &lch, &rch); //用scanf之前会MLE,将scanf改为cin就可以AC,?
            cin>>fa>>lch>>rch;
            getchar(); // 吸收换行符
            bintree_index[fa-'a'][0] = lch;
            bintree_index[fa-'a'][1] = rch;

            if(i==0) r = fa;
        }
        root = CreateTree(bintree_index, r);
        PreOrder(root); printf("\n");
        Release(root);
    }
    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 ``` 通过这个解决方案,您可以高效地计算出任意二叉树的最大深度。实际编码时注意根据题目给出的数据范围调整数组大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值