eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak usunąć najlepiej element z drzewa ? › Jak usunąć najlepiej element z drzewa ?
  • Data: 2018-03-15 01:57:02
    Temat: Jak usunąć najlepiej element z drzewa ?
    Od: Borneq <b...@a...hidden.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    podczas gdy nie można wołać a.remove() a co najwyżej usuwać dzieci tego
    węzła.

    kod:
    #include <memory>
    #include <string>
    #include <vector>
    #include <assert.h>

    using namespace std;

    class Node
    {
    vector<shared_ptr<Node>> childs;
    Node* parent = nullptr;//not shared_ptr! because of memory leaks of
    circular dependency
    int level = 0;
    public:
    string name;
    Node(string name)
    {
    this->name = name;
    }
    ~Node()
    {
    printf("delete %s\n",name.c_str());
    }
    shared_ptr<Node> clone()
    {
    shared_ptr<Node> result = make_shared<Node>(name+"a");
    return result;
    }
    void erase()
    {
    printf("erase from %s\n", name.c_str());
    childs.clear();
    }
    void Add(shared_ptr<Node> node)
    {
    shared_ptr<Node> clone = node->clone();
    childs.push_back(clone);
    clone->parent = this;
    clone->level = level+1;
    for (size_t i = 0; i<node->childs.size(); i++)
    clone->Add(node->childs[i]);
    }
    shared_ptr<Node>& at(int index)
    {
    return childs[index];
    }
    void print()
    {
    for (int i = 0; i<level; i++)
    printf(" ");
    printf("%s->",name.c_str());
    if (parent) printf("%s", parent->name.c_str());
    printf("\n");
    for (size_t i=0; i<childs.size(); i++)
    childs[i]->print();
    }
    };

    int main()
    {
    shared_ptr<Node>root,rootB;
    root = make_shared<Node>("1");
    root->Add(make_shared<Node>("2"));
    root->Add(make_shared<Node>("3"));
    root->at(0)->Add(make_shared<Node>("4"));
    root->at(0)->Add(make_shared<Node>("5"));
    root->at(1)->Add(make_shared<Node>("6"));
    root->at(1)->Add(make_shared<Node>("7"));

    rootB = make_shared<Node>("1b");
    rootB->Add(make_shared<Node>("2b"));
    rootB->Add(make_shared<Node>("3b"));
    rootB->at(0)->Add(make_shared<Node>("4b"));
    rootB->at(0)->Add(make_shared<Node>("5b"));
    rootB->at(1)->Add(make_shared<Node>("6b"));
    rootB->at(1)->Add(make_shared<Node>("7b"));
    // node->Add(root);
    //root->print();printf("\n");
    //rootB->print(); printf("\n");
    root->at(0)->Add(rootB);
    rootB = nullptr;
    //rootB->at(0)->Add(rootB);//tu cykl?
    root->print();
    root->at(0)->erase();
    root->print();
    return 0;
    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: