You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中N叉树特定根节点查找及学生成绩插入逻辑实现问题

基于N叉树的学生成绩存储逻辑实现方案

首先你需要一个全局或类成员的容器来管理所有学生的N叉树根节点,比如用std::unordered_map<int, TreeNode*>来快速根据学生ID查找对应的树。另外先明确TreeNode的基础结构(假设包含节点值、子节点列表):

struct TreeNode {
    int val;
    std::vector<TreeNode*> children;
    TreeNode(int x) : val(x) {}
};

// 全局容器:学生ID -> 对应N叉树根节点
std::unordered_map<int, TreeNode*> studentTrees;

接下来修正add_result函数的判断逻辑,严格对应你的三种需求场景:

void add_result() {
    int grade;
    int studentid;
    int testid;

    display_all_students();
    std::cout << "Enter student id:\n";
    std::cin >> studentid;

    display_all_test();
    std::cout << "Enter test id:\n";
    std::cin >> testid;

    std::cout << "Enter grade:\n";
    std::cin >> grade;

    // 第一步:查找学生是否已注册
    auto studentIt = studentTrees.find(studentid);
    if (studentIt != studentTrees.end()) {
        TreeNode* studentRoot = studentIt->second;
        // 学生存在,遍历子节点查找对应科目
        TreeNode* subjectNode = nullptr;
        for (auto child : studentRoot->children) {
            if (child->val == testid) {
                subjectNode = child;
                break;
            }
        }

        if (subjectNode != nullptr) {
            // 场景1:学生和科目都存在,替换成绩
            if (!subjectNode->children.empty()) {
                subjectNode->children[0]->val = grade;
            } else {
                // 极端补全:科目节点无成绩时直接新增
                subjectNode->children.push_back(new TreeNode(grade));
            }
        } else {
            // 场景2:学生存在、科目不存在,新增科目和成绩节点
            TreeNode* newSubject = new TreeNode(testid);
            newSubject->children.push_back(new TreeNode(grade));
            studentRoot->children.push_back(newSubject);
        }
    } else {
        // 场景3:学生未注册,新建完整N叉树
        TreeNode* newStudentRoot = new TreeNode(studentid);
        TreeNode* newSubject = new TreeNode(testid);
        newSubject->children.push_back(new TreeNode(grade));
        newStudentRoot->children.push_back(newSubject);
        studentTrees[studentid] = newStudentRoot;
    }
}

关于嵌套Map的误解纠正

你之前误以为嵌套Map会限制每个学生只能存一个科目,这是错误的。用std::map<int, std::map<int, int>>(外层Key为学生ID,内层Key为科目ID,Value为成绩)完全满足需求,每个学生可对应多个科目,且实现逻辑比N叉树简单得多:

// 嵌套Map存储:学生ID -> 科目ID -> 成绩
std::map<int, std::map<int, int>> studentGrades;

void add_result_with_map() {
    int grade;
    int studentid;
    int testid;

    display_all_students();
    std::cout << "Enter student id:\n";
    std::cin >> studentid;

    display_all_test();
    std::cout << "Enter test id:\n";
    std::cin >> testid;

    std::cout << "Enter grade:\n";
    std::cin >> grade;

    // 一行代码完成所有逻辑:存在则替换,不存在则自动新增
    studentGrades[studentid][testid] = grade;
}

这种方式无需手动处理复杂的树节点遍历,STL容器会自动完成所有判断逻辑。

内容的提问来源于stack exchange,提问作者thelastcodebender

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:21:23