eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak usunąć najlepiej element z drzewa ? › Re: Jak usunąć najlepiej element z drzewa ?
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: Borneq <b...@a...hidden.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: Jak usunąć najlepiej element z drzewa ?
    Date: Thu, 15 Mar 2018 23:46:09 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 120
    Message-ID: <p8et3h$la0$1@node1.news.atman.pl>
    References: <p8cgcv$bd7$1@node1.news.atman.pl> <p8d69b$p3b$1@node2.news.atman.pl>
    <p8dia4$4c4$1@node2.news.atman.pl> <p8dlhd$eah$1@node1.news.atman.pl>
    <p8drp1$d3l$1@node2.news.atman.pl> <p8ds7o$l09$1@node1.news.atman.pl>
    <p8dtuu$f4c$1@node2.news.atman.pl>
    <9...@g...com>
    <p8ee5g$6h9$1@node1.news.atman.pl>
    <9...@g...com>
    <p8epa1$hic$1@node1.news.atman.pl>
    <1...@g...com>
    NNTP-Posting-Host: public-gprs350577.centertel.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1521153969 21824 37.47.0.178 (15 Mar 2018 22:46:09 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Thu, 15 Mar 2018 22:46:09 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
    Thunderbird/52.6.0
    In-Reply-To: <1...@g...com>
    Content-Language: pl
    Xref: news-archive.icm.edu.pl pl.comp.programming:212336
    [ ukryj nagłówki ]

    W dniu 15.03.2018 o 23:00, M.M. pisze:
    > Hmmm a po co usuwasz węzeł w drzewie do reprezentacji wyrażeń
    > arytmetycznych?

    Po to by zastąpić zmienną całym wyrażeniem.
    Coś takiego:
    ma symbolicznie robić operację postawiania:
    na przykład gdy liczymy pierwiastek z n to ze wzoru (wybierając x
    początkowe)
    x:= (x+n/x)/2
    druga iteracja, podstawiamy wszędzie gdzie x całe wyrażenie:
    otrzymujemy ((x+n/x)/2+n/((x+n/x)/2))/2
    możemy dalej
    (((x+n/x)/2+n/((x+n/x)/2))/2+n/(((x+n/x)/2+n/((x+n/x
    )/2))/2))/2

    Działa już klonowanie (można podczepić całe drzewko do swojej podgałęzi,
    jeszcze nie mam tu replace- jest innej wersji , gdzie nie działało
    klonowanie), trzeba dorobić dziedziczenie:
    #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> cloneOne()
    {
    shared_ptr<Node> result = make_shared<Node>(name+"a");
    return result;
    }

    shared_ptr<Node> cloneTree()
    {
    shared_ptr<Node> newElem = cloneOne();
    for (size_t i = 0; i<childs.size(); i++)
    {
    shared_ptr<Node> subElem = childs[i]->cloneTree();
    newElem->AddOneChild(subElem);
    }
    return newElem;
    }

    void erase()
    {
    printf("erase from %s\n", name.c_str());
    childs.clear();
    }
    void deleteChild(int index)
    {
    printf("delete child %d from %s - %s\n", index, name.c_str(),
    childs[index]->name.c_str());
    childs.erase(childs.begin()+index);
    }

    void setLevel(int level)
    {
    this->level = level;
    for (size_t i = 0; i<childs.size(); i++)
    childs[i]->setLevel(level+1);
    }

    void AddOneChild(shared_ptr<Node> node)
    {
    childs.push_back(node);
    node->parent = this;
    }

    void AddTree(shared_ptr<Node> node)
    {
    shared_ptr<Node> clone = node->cloneTree();
    AddOneChild(clone);
    clone->setLevel(level+1);
    }
    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->AddTree(make_shared<Node>("2"));
    root->AddTree(make_shared<Node>("3"));
    root->at(0)->AddTree(make_shared<Node>("4"));
    root->at(0)->AddTree(make_shared<Node>("5"));
    root->at(1)->AddTree(make_shared<Node>("6"));
    root->at(1)->AddTree(make_shared<Node>("7"));
    root->at(1)->AddTree(root);
    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: