鱼C论坛

 找回密码
 立即注册
查看: 3873|回复: 24

[已解决]求二叉树深度,为什么只有80分

[复制链接]
发表于 2022-10-27 19:55:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2022-11-4 21:35 编辑

描述和格式见后面的图片

输入样例:
  1. 7
  2. 2 7
  3. 3 6
  4. 4 5
  5. 0 0
  6. 0 0
  7. 0 0
  8. 0 0
复制代码

输出样例:
  1. 4
复制代码

我的代码:
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;

  4. int n, a[1000001], d[1000001], x, y, ans = -(1 << 30);

  5. int main() {
  6.         scanf("%d", &n);
  7.         d[1] = 1;
  8.         for (int i = 1; i <= n; ++i) {
  9.                 scanf("%d%d", &x, &y);
  10.                 if (x) ans = max(d[x] = d[i] + 1, ans);
  11.                 if (y) ans = max(d[y] = d[i] + 1, ans);
  12.         }
  13.         printf("%d", ans);
  14. }
复制代码
最佳答案
2022-10-27 23:52:51
稍微改一改
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>

  5. using std::vector, std::array;
  6. using std::cin, std::cout, std::endl;
  7. using std::istream;
  8. using std::max;

  9. using tree_t = vector<array<size_t, 2>>;

  10. istream &operator>>(istream &is, tree_t &tree) {
  11.     tree_t temp; temp.push_back({});    // 不使用tree[0]
  12.     size_t count; is >> count;
  13.     for(size_t i = 0; i < count; ++i) {
  14.         array<size_t, 2> a; is >> a[0] >> a[1];
  15.         temp.push_back(a);
  16.     }
  17.     return tree = temp, is;
  18. }

  19. size_t get_depth(const tree_t &tree, size_t node, size_t init) {
  20.     if(!node) return init;
  21.     return ++init, max(get_depth(tree, tree[node][0], init), get_depth(tree, tree[node][1], init));
  22. }

  23. int main() {
  24.     tree_t tree; cin >> tree;
  25.     cout << get_depth(tree, 1, 0) << endl;
  26.     return 0;
  27. }
复制代码
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-27 22:50:15 | 显示全部楼层
题目要求建立一个二叉树,至少要有二叉树构造吧?class 或 struct
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-27 23:09:42 | 显示全部楼层
这个分数是怎么算的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-27 23:43:08 | 显示全部楼层
不知道对不对,多给几组输入/输出看看

  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>

  5. using std::vector, std::array;
  6. using std::cin, std::cout, std::endl;
  7. using std::istream;
  8. using std::max;

  9. using tree_t = vector<array<size_t, 2>>;

  10. istream &operator>>(istream &is, tree_t &tree) {
  11.     tree_t temp; temp.push_back({});    // 不使用tree[0]
  12.     size_t count; is >> count;
  13.     for(size_t i = 0; i < count; ++i) {
  14.         array<size_t, 2> a;
  15.         is >> a[0] >> a[1];
  16.         temp.push_back(a);
  17.     }
  18.     return tree = temp, is;
  19. }

  20. size_t get_depth(const tree_t &tree, size_t node, size_t init) {
  21.     if(!node) return init;
  22.     return max(get_depth(tree, tree[node][0], init + 1), get_depth(tree, tree[node][1], init + 1));
  23. }

  24. int main() {
  25.     tree_t tree; cin >> tree;
  26.     cout << get_depth(tree, 1, 0) << endl;
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-27 23:48:02 | 显示全部楼层
傻眼貓咪 发表于 2022-10-27 22:50
题目要求建立一个二叉树,至少要有二叉树构造吧?class 或 struct

题目没有说把二叉树建立成什么形式
我想直接在数组中保存结点的形式也是可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-27 23:52:51 | 显示全部楼层    本楼为最佳答案   
稍微改一改
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>

  5. using std::vector, std::array;
  6. using std::cin, std::cout, std::endl;
  7. using std::istream;
  8. using std::max;

  9. using tree_t = vector<array<size_t, 2>>;

  10. istream &operator>>(istream &is, tree_t &tree) {
  11.     tree_t temp; temp.push_back({});    // 不使用tree[0]
  12.     size_t count; is >> count;
  13.     for(size_t i = 0; i < count; ++i) {
  14.         array<size_t, 2> a; is >> a[0] >> a[1];
  15.         temp.push_back(a);
  16.     }
  17.     return tree = temp, is;
  18. }

  19. size_t get_depth(const tree_t &tree, size_t node, size_t init) {
  20.     if(!node) return init;
  21.     return ++init, max(get_depth(tree, tree[node][0], init), get_depth(tree, tree[node][1], init));
  22. }

  23. int main() {
  24.     tree_t tree; cin >> tree;
  25.     cout << get_depth(tree, 1, 0) << endl;
  26.     return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-28 07:35:14 | 显示全部楼层

我只是想说,我的这个代码有没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-28 07:35:45 | 显示全部楼层
傻眼貓咪 发表于 2022-10-27 22:50
题目要求建立一个二叉树,至少要有二叉树构造吧?class 或 struct

我的代码有问题吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:08:21 | 显示全部楼层
zhangjinxuan 发表于 2022-10-28 07:35
我只是想说,我的这个代码有没有问题

https://fishc.com.cn/forum.php?m ... 003&pid=6029054
不知道对不对,"""多给几组输入/输出看看"""

https://fishc.com.cn/forum.php?m ... 003&pid=6029011
""" 这个分数是怎么算的?"""

分数怎么算的?也许就是因为你的代码写的不够优雅,扣了你20分

多给几组输入/输出看看
就一组输入/输出看不出问题

还有,在哪组输入/输出上面出了问题?
你的刷题网站不显示出问题的输入/输出?


我的回复都是有用的,你的看我的回复
我问你的问题就是你提问题的时候漏掉的那部分
没有你漏掉的那部分,问题就很不好解决
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:14:23 | 显示全部楼层
zhangjinxuan 发表于 2022-10-28 07:35
我的代码有问题吗?


有肯定是有,首先的第一个问题就是你的代码写的不够优雅
要我做裁判,凭这一点就扣你20分不行吗?
^_^

确实在我看来,问题不是对就是错,不是0分就是100分
如果你非要细分的话,那就是在答案正确的前提下,看你代码写的怎么样

所以我要问你计分规则是怎么样的,因为在我看来就是上面说到的那样
代码写的不够优雅,扣20分
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:16:39 | 显示全部楼层
zhangjinxuan 发表于 2022-10-28 07:35
我只是想说,我的这个代码有没有问题

可是我想知道我的代码有没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:27:45 | 显示全部楼层
本帖最后由 人造人 于 2022-10-28 10:28 编辑

知道吗?一个不能重现的问题基本无解
如果知道了出问题的那组输入/输出
可以非常容易的找出代码中的问题
用调试器把程序运行起来,输入出问题的那个输入数据,一行代码一行代码的执行,看执行结果,如果执行结果即将脱离正确答案的那条路径
那问题就在这里了,如果是函数调用,那就重新运行程序,一样的输入,在这个函数的时候跟进去,一样的方法,看看哪行代码脱离了正确答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:30:24 | 显示全部楼层
调试程序是作为程序员的必备技能,同意吗?同意吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 10:38:44 | 显示全部楼层
考虑这组输入,应该不是能产生问题的最小输入,但是也比较小好分析了
  1. 7
  2. 5 7
  3. 4 6
  4. 0 0
  5. 0 0
  6. 2 0
  7. 0 0
  8. 0 3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 12:49:50 | 显示全部楼层
dolly_yos2 发表于 2022-10-28 10:38
考虑这组输入,应该不是能产生问题的最小输入,但是也比较小好分析了

这是3棵树吧?
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 12:58:20 | 显示全部楼层
dolly_yos2 发表于 2022-10-28 10:38
考虑这组输入,应该不是能产生问题的最小输入,但是也比较小好分析了

好吧,是我不认真看错了
抱歉,^_^

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 13:21:14 | 显示全部楼层
  1. 7
  2. 5 7
  3. 4 6
  4. 0 0
  5. 0 0
  6. 2 0
  7. 0 0
  8. 0 3
复制代码


就是 dolly_yos2 给出的这个输入/输出
你的这个程序在这个输入上,输出的结果是错误的
正确答案是4,你的程序给出了3
调试了一下你的程序,看不懂你在做什么
你这个数组d中存储的是什么?
你求树的深度用的什么方法?
对于这个输入,1的左孩子是5,右孩子是7
你这个数组d里面没有5和7
你这个数组里面存储的这些值表示什么意思?

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 14:09:06 | 显示全部楼层
上面的那个程序从逻辑上来讲是不对的,而且也不需要init参数
再改一改
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>

  5. using std::vector, std::array;
  6. using std::cin, std::cout, std::endl;
  7. using std::istream;
  8. using std::max;

  9. using tree_t = vector<array<size_t, 2>>;

  10. istream &operator>>(istream &is, tree_t &tree) {
  11.     tree_t temp; temp.push_back({});    // 不使用tree[0]
  12.     size_t count; is >> count;
  13.     for(size_t i = 0; i < count; ++i) {
  14.         array<size_t, 2> a; is >> a[0] >> a[1];
  15.         temp.push_back(a);
  16.     }
  17.     return tree = temp, is;
  18. }

  19. size_t get_depth(const tree_t &tree, size_t node) {
  20.     if(!node) return 0;
  21.     return max(get_depth(tree, tree[node][0]), get_depth(tree, tree[node][1])) + 1;
  22. }

  23. int main() {
  24.     tree_t tree; cin >> tree;
  25.     cout << get_depth(tree, 1) << endl;
  26.     return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 17:30:30 | 显示全部楼层
zhangjinxuan 发表于 2022-10-28 07:35
我的代码有问题吗?
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. struct node{
  4.         int lc, rc;
  5. } tree[1000005];
  6. int n, l, r, ans;

  7. void dfs(int pos, int dep){
  8.         if(!tree[pos].lc && !tree[pos].rc){
  9.                 ans = max(ans, dep);
  10.         }
  11.         if(tree[pos].lc) dfs(tree[pos].lc, dep + 1);
  12.         if(tree[pos].rc) dfs(tree[pos].rc, dep + 1);
  13. }

  14. int main(){
  15.         ios::sync_with_stdio(0);
  16.         cin.tie(0);
  17.        
  18.         cin >> n;
  19.         for(int i = 1; i <= n; i++){
  20.                 cin >> l >> r;
  21.                 tree[i] = {l, r};
  22.         }

  23.         dfs(1, 1);

  24.         cout << ans ;
  25.        
  26.         return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-28 19:18:54 | 显示全部楼层
zhangjinxuan 发表于 2022-10-28 07:35
我的代码有问题吗?

应该是没有问题,因为可以得到 80 分,我猜可能不完善吧,或是像人造人大佬说的那样,不够优雅吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 06:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表