{"id":54389,"date":"2019-12-25T00:00:00","date_gmt":"2019-12-24T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/indeksiruemoe-binarnoe-derevo"},"modified":"2020-02-18T14:02:23","modified_gmt":"2020-02-18T11:02:23","slug":"indeksiruemoe-binarnoe-derevo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","title":{"rendered":"Indeksowane drzewo binarne","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/8ceb987e007db02de04d29f33185e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Znalaz\u0142em zadanie nast\u0119puj\u0105cego typu. Nale\u017cy zaimplementowa\u0107 kontener do przechowywania danych, kt\u00f3ry zapewnia nast\u0119puj\u0105c\u0105 funkcjonalno\u015b\u0107: <\/p>\n<p><\/p>\n<ul>\n<li>doda\u0107 nowy element<\/li>\n<li>usun\u0105\u0107 element wed\u0142ug numeru porz\u0105dkowego<\/li>\n<li>uzyska\u0107 element wed\u0142ug numeru porz\u0105dkowego<\/li>\n<li>dane s\u0105 przechowywane w posortowanej formie<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Dane s\u0105 stale dodawane i usuwane, struktura musi zapewnia\u0107 wysok\u0105 szybko\u015b\u0107 dzia\u0142ania. Na pocz\u0105tku pr\u00f3bowa\u0142em zrealizowa\u0107 to korzystaj\u0105c z standardowych kontener\u00f3w z <strong>std<\/strong>. Ta droga nie przynios\u0142a sukcesu, wi\u0119c zrozumia\u0142em, \u017ce musz\u0119 co\u015b zaimplementowa\u0107 samodzielnie. Jedyn\u0105 my\u015bl\u0105, kt\u00f3ra mi pojawi\u0142a, by\u0142o u\u017cycie drzewa binarnego wyszukiwania, poniewa\u017c spe\u0142nia ono wymagania szybkiego dodawania, usuwania i przechowywania danych w posortowanej formie. Pozosta\u0142o tylko wymy\u015bli\u0107, jak zaindeksowa\u0107 wszystkie elementy i przelicza\u0107 indeksy, gdy drzewo si\u0119 zmienia.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">struct node_s {    \n    data_t data;\n\n    uint64_t weight; \/\/ waga w\u0119z\u0142a\n\n    node_t *left;\n    node_t *right;\n\n    node_t *parent;\n};<\/code><\/pre>\n<p><\/p>\n<p>W artykule b\u0119dzie wi\u0119cej obrazk\u00f3w i teorii ni\u017c kodu. Kod b\u0119dzie mo\u017cna zobaczy\u0107 pod linkiem na dole.<\/p>\n<p><\/p>\n<h2 id=\"ves\">Waga<\/h2>\n<p><\/p>\n<p>W tym celu drzewo przesz\u0142o niewielk\u0105 modyfikacj\u0119, dodano dodatkowe informacje o <strong>wadze<\/strong> w\u0119z\u0142a. Waga w\u0119z\u0142a to <strong>liczba potomk\u00f3w danego w\u0119z\u0142a<\/strong> + <strong>1<\/strong> (waga pojedynczego elementu).<\/p>\n<p><\/p>\n<p>Funkcja uzyskiwania wagi w\u0119z\u0142a:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">uint64_t bntree::get_child_weight(node_t *node) {\n    if (node) {\n        return node-&gt;weight;\n    }\n\n    return 0;\n}<\/code><\/pre>\n<p><\/p>\n<p>Dla li\u015bcia waga wynosi odpowiednio <strong>0<\/strong>.<\/p>\n<p><\/p>\n<p>Przejd\u017amy teraz do graficznej reprezentacji przyk\u0142adu takiego drzewa. <strong>Czarnym<\/strong> kolorem w nim b\u0119dzie pokazany klucz w\u0119z\u0142a (warto\u015b\u0107 nie b\u0119dzie pokazywana, poniewa\u017c nie ma takiej potrzeby), <strong>czerwonym<\/strong> \u2014 waga w\u0119z\u0142a, <strong>zielonym<\/strong> \u2014 indeks w\u0119z\u0142a.<\/p>\n<p><\/p>\n<p>Kiedy drzewo jest puste, jego waga wynosi 0. Dodajmy do niego element g\u0142\u00f3wny:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/2d4145039daee26582910556a40d2a5c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Waga drzewa staje si\u0119 1, waga elementu g\u0142\u00f3wnego wynosi 1. Waga elementu g\u0142\u00f3wnego jest wag\u0105 drzewa.<\/p>\n<p><\/p>\n<p>Dodajmy jeszcze kilka element\u00f3w:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/803cc4a65aa3d8a2fcb20fe325351cfa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/0aa12f41b822b4bb1e9fadb7564dc461.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/8566df9404037e92f53b315bc3304016.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/1847e6ddffdb28d0a6d9a4949ebb5f80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Za ka\u017cdym razem, gdy dodawany jest nowy element, schodzimy w d\u00f3\u0142 przez w\u0119z\u0142y i zwi\u0119kszamy licznik wagi ka\u017cdego przechodzonego w\u0119z\u0142a. Przy tworzeniu nowego w\u0119z\u0142a nadaje mu si\u0119 wag\u0119 <strong>1<\/strong>. Je\u015bli w\u0119ze\u0142 z takim kluczem ju\u017c istnieje, to nadpiszemy warto\u015b\u0107 i wr\u00f3cimy w g\u00f3r\u0119 do korzenia, cofaj\u0105c zmiany wag u wszystkich w\u0119z\u0142\u00f3w, kt\u00f3re przechodzili\u015bmy.<br \/>\nJe\u015bli dochodzi do usuni\u0119cia w\u0119z\u0142a, schodzimy w d\u00f3\u0142 i dekrementujemy wagi przechodzonych w\u0119z\u0142\u00f3w. <\/p>\n<p><\/p>\n<h2 id=\"indeksy\">Indeksy<\/h2>\n<p><\/p>\n<p>Teraz przejd\u017amy do tego, jak zindeksowa\u0107 w\u0119z\u0142y. W\u0119z\u0142y nie przechowuj\u0105 jawnie swojego indeksu, jest on obliczany na podstawie wagi w\u0119z\u0142\u00f3w. Gdyby przechowywa\u0142y sw\u00f3j indeks, potrzebny by\u0142by <strong>O(n)<\/strong> czas, aby zaktualizowa\u0107 indeksy wszystkich w\u0119z\u0142\u00f3w po ka\u017cdej zmianie w drzewie.<br \/>\nPrzejd\u017amy do wizualnej reprezentacji. Nasze drzewo jest puste, dodajmy do niego pierwszy w\u0119ze\u0142:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/8a3b176f318cd077b1cf50ddf232e0da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pierwszy w\u0119ze\u0142 ma indeks <strong>0<\/strong>, a teraz mog\u0105 wyst\u0105pi\u0107 2 przypadki. W pierwszym przypadku indeks elementu g\u0142\u00f3wnego si\u0119 zmieni, w drugim nie zmieni.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/cb863be8f42385d3bbb2f46700a8cff3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Lewe poddrzewo korzenia wa\u017cy 1.<\/p>\n<p><\/p>\n<p>Drugi przypadek:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/35eec59a81fc8b056c7e91daa3ee508e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Indeks korzenia nie zmieni\u0142 si\u0119, poniewa\u017c waga jego lewego poddrzewa pozosta\u0142a 0.<\/p>\n<p><\/p>\n<p>Indeks w\u0119z\u0142a oblicza si\u0119 jako waga jego lewego poddrzewa + liczba przekazana przez rodzica. Co to za liczba? To licznik indeks\u00f3w, pocz\u0105tkowo r\u00f3wny <strong>0<\/strong>, poniewa\u017c korze\u0144 nie ma rodzica. Potem wszystko zale\u017cy od tego, czy schodzimy do lewego dziecka, czy do prawego. Je\u015bli do lewego, to licznik si\u0119 nie zwi\u0119ksza. Je\u015bli do prawego, to dodajemy indeks bie\u017c\u0105cego w\u0119z\u0142a.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksowane drzewo binarne\" src=\"\/wp-content\/uploads\/2019\/12\/d328174370ef52c646d8689cce977302.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Na przyk\u0142ad, jak oblicza si\u0119 indeks elementu z kluczem 8 (prawy potomek korzenia). To &#171;Indeks korzenia&#187; + &#171;ci\u0119\u017car lewego poddrzewa w\u0119z\u0142a z kluczem 8&#187; + &#171;1&#187; == 3 + 2 + 1 == <strong>6<\/strong><br \/>\nIndeksem elementu z kluczem 6 b\u0119dzie &#171;Indeks korzenia&#187; + 1 == 3 + 1 == <strong>4<\/strong><\/p>\n<p><\/p>\n<p>W zwi\u0105zku z tym, aby uzyska\u0107 lub usun\u0105\u0107 element wed\u0142ug indeksu, potrzebny jest czas <strong>O(log n)<\/strong>, poniewa\u017c aby uzyska\u0107 potrzebny element, musimy najpierw go znale\u017a\u0107 (zej\u015b\u0107 od korzenia do tego elementu).<\/p>\n<p><\/p>\n<h2 id=\"glubina\">G\u0142\u0119bia<\/h2>\n<p><\/p>\n<p>Na podstawie wagi mo\u017cna r\u00f3wnie\u017c obliczy\u0107 g\u0142\u0119boko\u015b\u0107 drzewa. Niezb\u0119dna do r\u00f3wnowa\u017cenia.<br \/>\nAby to zrobi\u0107, wag\u0119 bie\u017c\u0105cego w\u0119z\u0142a nale\u017cy zaokr\u0105gli\u0107 do pierwszej liczby w pot\u0119dze 2, kt\u00f3ra jest wi\u0119ksza lub r\u00f3wna danej wadze, i wzi\u0105\u0107 z niej logarytm binarny. W ten spos\u00f3b uzyskamy g\u0142\u0119boko\u015b\u0107 drzewa, pod warunkiem, \u017ce jest ono zr\u00f3wnowa\u017cone. Drzewo jest r\u00f3wnowa\u017cone po wstawieniu nowego elementu. Nie b\u0119d\u0119 przedstawia\u0107 teorii dotycz\u0105cej r\u00f3wnowa\u017cenia drzew. W oryginalnych kodach znajduje si\u0119 funkcja r\u00f3wnowa\u017cenia.<\/p>\n<p><\/p>\n<p>Kod przekszta\u0142ce\u0144 wagi w g\u0142\u0119boko\u015b\u0107.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/*\n * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 2, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u043e\u0432\u043d\u043e x\n *\/\nuint64_t bntree::cpl2(uint64_t x) {\n    x = x - 1;\n    x = x | (x &gt;&gt; 1);\n    x = x | (x &gt;&gt; 2);\n    x = x | (x &gt;&gt; 4);\n    x = x | (x &gt;&gt; 8);\n    x = x | (x &gt;&gt; 16);\n    x = x | (x &gt;&gt; 32);\n\n    return x + 1;\n}\n\n\/*\n * \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u043e\u0442 \u0447\u0438\u0441\u043b\u0430\n *\/\nlong bntree::ilog2(long d) {\n    int result;\n    std::frexp(d, &amp;result);\n    return result - 1;\n}\n\n\/*\n * \u0412\u0435\u0441 \u043a \u0433\u043b\u0443\u0431\u0438\u043d\u0435\n *\/\nuint64_t bntree::weight_to_depth(node_t *p) {\n    if (p == NULL) {\n        return 0;\n    }\n\n    if (p-&gt;weight == 1) {\n        return 1;\n    } else if (p-&gt;weight == 2) {\n        return 2;\n    }\n\n    return this-&gt;ilog2(this-&gt;cpl2(p-&gt;weight));\n}<\/code><\/pre>\n<p><\/p>\n<h2 id=\"itogi\">Podsumowanie<\/h2>\n<p><\/p>\n<ul>\n<li>Wstawienie nowego elementu odbywa si\u0119 w <strong>O(log n)<\/strong><\/li>\n<li>Usuni\u0119cie elementu wed\u0142ug numeru porz\u0105dkowego odbywa si\u0119 w <strong>O(log n)<\/strong><\/li>\n<li>Uzyskanie elementu wed\u0142ug numeru porz\u0105dkowego odbywa si\u0119 w <strong>O(log n)<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>Szybko\u015bci\u0105 <strong>O(log n)<\/strong> p\u0142acimy za to, \u017ce wszystkie dane s\u0105 przechowywane w uporz\u0105dkowanej formie. <\/p>\n<p><\/p>\n<p>Gdzie mo\u017ce by\u0107 przydatna taka struktura \u2014 nie wiem. Po prostu zadanie, aby jeszcze raz zrozumie\u0107, jak dzia\u0142aj\u0105 drzewa. Dzi\u0119kuj\u0119 za uwag\u0119.<\/p>\n<p><\/p>\n<h2 id=\"ssylki\">Linki<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dvjdjvu\/bntree\">Kod \u017ar\u00f3d\u0142owy drzewa<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Projekt zawiera dane testowe do sprawdzenia szybko\u015bci dzia\u0142ania. Drzewo jest wype\u0142niane <strong>1000000<\/strong> elementami. I odbywa si\u0119 kolejno usuwanie, wstawianie i pobieranie element\u00f3w <strong>1000000<\/strong> raz. To znaczy <strong>3000000<\/strong> operacji. Wynik okaza\u0142 si\u0119 ca\u0142kiem niez\u0142y ~ 8 sekund.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/481372\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u0435\u0449\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438\u0437 std. \u042d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54389","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-24T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Indeksowane drzewo binarne | ProHoster","description":"Znalaz\u0142em zadanie nast\u0119puj\u0105cego typu.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e | ProHoster","og:description":"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-24T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54389","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 11:11:41","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:07:24","updated":"2026-01-24 11:11:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=54389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=54389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=54389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=54389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}