我有一棵通用树:

Node{
    int information;
    vector<Node*> childs;
}

这是我的析构函数实现:
~Node(){
    for(int i = 0; i < childs.size(); i++) {
        delete childs[i];
    }

问题是我允许 children 一样。例如:NodeA具有子B,C,B,C,C。由于B无法删除两次,因此破坏了析构函数的实现。

什么是解决此问题的最佳解决方案?

最佳答案

首先,请注意一点:这不是一棵树,
而是一个更通用的图形,因为树没有循环。

关于您的问题,一种快速的解决方案是对所有 child 进行排序(按地址);那么您可以在迭代重复的位置时轻​​松识别它,并跳过它们。像那样:

if(childs.size() == 0) return;
std::sort(childs.begin(), childs.end());
childs.remove(std::unique(childs.begin(), childs.end()), childs.end());
for (auto& child : childs) delete child;

09-07 07:26