鱼C论坛

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

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

[复制链接]
发表于 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 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 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 19:48:21 | 显示全部楼层
傻眼貓咪 发表于 2022-10-28 19:18
应该是没有问题,因为可以得到 80 分,我猜可能不完善吧,或是像人造人大佬说的那样,不够优雅吧

看17楼
  1. 7
  2. 5 7
  3. 4 6
  4. 0 0
  5. 0 0
  6. 2 0
  7. 0 0
  8. 0 3
复制代码


这组输入,应该输出4,他的程序输出的是3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-25 03:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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