数据结构与算法:如何在Tree结构中实现添加子节点功能
实现addChild函数的方案
一、addChild完整实现
直接在Tree.cpp的addChild函数里填入以下代码:
void Tree::addChild(Position* parent, Position* pos) { // 1. 设置pos的父指针指向parent pos->setParent(parent); // 2. 特殊情况:如果parent为空,说明pos是根节点 if (parent == nullptr) { setRoot(pos); } else { // 把pos添加到parent的子节点列表末尾 parent->getChildren().insertBack(pos); } // 3. 把pos添加到树的全局节点列表中 positions->insertBack(pos); }
二、迭代器相关说明
你不需要手动操作迭代器就能完成这个功能,因为PositionList已经封装好了插入接口:
insertBack(Position* pos)内部已经自动调用了insert(end(), pos),其中end()返回的就是PositionList::Iterator迭代器对象,内部已经处理了节点的前后指针绑定逻辑。
如果你之后需要遍历某个节点的子节点,就可以用迭代器实现,示例如下:
// 遍历parent的所有子节点 PositionList& children = parent->getChildren(); for (PositionList::Iterator it = children.begin(); it != children.end(); ++it) { Position& child = *it; cout << *child << endl; // 输出子节点的元素值 }
这里的迭代器本质是对列表节点指针的封装,重载了*、++、==等运算符,用来简化列表遍历操作,避免你直接操作裸指针出错。
三、注意事项
- 记得在
Tree的构造函数中初始化positions指针,否则会触发空指针崩溃,构造函数里要加一行:positions = new PositionList(); - 你当前的
main函数里创建了Tree对象后,需要调用addChild构建树结构,比如:// 根节点父指针为空 tree.addChild(nullptr, mapWithPositions["/user/rt/courses"]); // 给根节点加子节点 tree.addChild(mapWithPositions["/user/rt/courses"], mapWithPositions["cs016/"]); tree.addChild(mapWithPositions["/user/rt/courses"], mapWithPositions["cs252/"]); // 后续层级以此类推添加即可
内容的提问来源于stack exchange,提问作者RoseSkull123
相关产品推荐
相关产品推荐

