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
相关产品推荐
相关产品推荐

