ПредишенСледващото

Всички произволни дърво сродени възли са раздалечени чрез динамично определяне стойност (в този случай 20), както и съседните възли (в този случай 40). В момента, когато се формира най-левия клон, то е причинено rasstonovka_uzlov метод, по който се предава на най-левия и горния десен разликата и която се е увеличила разликата между тях (в случая 20).
Това е, което се случва в rasstonovka_uzlov метода -

Как да се организира произволно дърво възли стека преливане на Руски

  1. линия се простира от горния ляв до горния десен и помисли интервали (в този случай, шест празни клетки, които, както е посочено по-рано от 20, което означава, че сумата от 120);
  2. разделяне на сумата, получен в предишния етап на броя възли плюс един (120/3 = 40);
  3. провери как текущия възел (аз съм се започне от ляво на дясно и на текущия възел е този, който има две деца) е изпратен от левия възел-брат (в този случай 80).
  4. Сега извадете 80-40 = 40, стойността е разстоянието, на което аз съм на текущия възел е пристрастен да е на правилното място.
  5. Ако тази стойност (40) е по-голяма от тази, при която се увеличава разстоянието между двете крайни възли, тази стойност става по-малък. Това се изчислява, че 40, но това вече не е активиран, а стойността се променя до 20.
  6. Аз се движат възел.

Как да се организира произволно дърво възли стека преливане на Руски

Повторете предходните шест стъпки към следващия възел -
1. получите 60
2. 60/2 = 30
3. 40
4. 30
5. 10
6.

Как да се организира произволно дърво възли стека преливане на Руски

Виждате ли как съм средно? На първо място, да разбера какво трябва да се премине към четиридесетте, но тъй като на четиридесет и движение, не мога да (нарушават правата на децата до дъното, те ще бъдат по-близо от четиридесет), Аз се преместих В максимална е двадесет. И тогава я преместя вече десет.
Например, ако в първия възел за обработка не са имали деца, а след това на снимката ще бъде, както следва -

Как да се организира произволно дърво възли стека преливане на Руски

За всеки случай, ако се случи по-рано възел, който може да бъде преместен на "колко нещо" (без деца), а след това, което не може да бъде изместен към "колко нещо", а след това на втория бях отново изместен до максимум, но в същото време прави алгоритъм от началото (или по-скоро с последната известна добра точка), но във времето, за да замени горния десен ток.

Аз ще покаже кода, но аз не искам да гледам недостатъците си, и само искам да разбереш смисъла.

Тук. Но след това се блъсна в един от следните проблеми, и може би това е само един.

Как да се организира произволно дърво възли стека преливане на Руски

Входните данни са едни и същи, но тя се разпада. Алгоритъм, както аз исках, не работи, а дори и да излезе с, аз не мога.
По-долу е крайният резултат -
Как да се организира произволно дърво възли стека преливане на Руски

Това е най-възела
тире - стойността, до която текущия възел е отстранен от предишния || -> | |
leftOffset - стойността, до която се преместих в ляво. В началото, той rightOffset = нула е стойността, за която се измества надясно. А също и по подразбиране е нула.

Тук. самите възли като обикновени възли, ssydka да Паренти, в които те се съхраняват в индексиран масив. Има методи за възли на индекса и да получат самия индекс.

Като цяло, това е необходимо да се организира възли вече постфактум, а не извратил с dviganiem във всяка рамка. Има две константи "братя" и "съседите" и "съседите" определя колко трябва да бъдат разположени в непосредствена близост поддървета на нива по-ниски от първия, и "братя" - първата. Тогава проблемът трябва да бъде решен от долу нагоре за всеки под-дърво първо изграждаме всеки свои поддървета, а след това ние изграждаме poderevo ток изчислява за всяка от следващите поддърво минимално изместване спрямо земята, в която на всяко ниво е поддървото няма да пречи на вече установени поддървета. В резултат на това всеки poderevo ще има "зает обхвата" на всяко ниво, където има най-малко един лист и той ще отиде сравнение с текущата поставянето на поддървото на горното ниво.

Т.е. алгоритъмът е както следва:

прав завършен както следва: Когато се добави към поддърво ниво и-м не са попълнени правилно, на аз + 1-м десен ниво не се променя, а ако има право беше изпратен стане достъпна компенсира плюс прав. лявото е изпълнен по подобен начин, но изпълнен само ако на това ниво все още не е завършен - като новите поддървета dobavlyayustya прав, първото поддървото с определена дълбочина ще постави лявата-дървото. При извършване на positionRoot () на целия масив от дясно и ляво е намалял с положение, при което горната част на масива 0 се добавя.

Аз ще се опитам да опиша разгръщането на алгоритъма. За описание на дървото ще се използва Lisp списъци, броят на - списъци, списъци - поддървета. Пример: ((1) (2 3 4 5)) съответства на такова дърво:

Първоначално дърво: (((1) 2) (((3))) ((4 5 6) ((7 8 9) (10)))). Поддървета на един лист не обмисля, без причина. Поддървото ((1) 2) има стойност: лява = [0, -10, -10]; надясно = [0,10, -10], и има следната форма:

Звездичките означават, върхове поддървета, тъй като няма елемент в списъците на "корен". Поддървото (((3))) е тривиална форма масиви и лявата стойност = [0,0,0,0]; надясно = [0,0,0,0]. Поддървото ((7 8 9) (10)) има стойност масиви оставени = [0, -30, -50]; надясно = [0,30,30] и изглежда така:

Поради факта, че поддърво (7 8 9), получен право [1] като 20 и компенсира "съседи" 40, втората поддървото се поставя в офсет 60 (0 + 40 + 20), и positionRoot е причинена от компенсиране на 30 ( = 60/2), в крайна сметка не е в лявото поддърво минус спрямо общото Крон -50. поддърво 4-10 събрание ще изглежда така:

Ограничител право положение поддърво тук е втория слой, където у (4 5 6) право [1] = 20, и се оставя [1] при -30 поддърво, общо общия обем е 90. В най-ниското ниво на левия поддървото не елементи, така че мис. Като positionRoot резултат ще бъде причинена на позиция 55 и общата масив изглежда наляво = [0, -55, -75.5]; надясно = [0,55,85,85]. След сглобяването на трите поддървета ще бъде изградена както следва: първият е поставен в компенсира 0, втората (((3))) при отместване 50 и голяма трети изместване на 50 + 40 + (- 75) = 165, и главата е изместен от 87,5 , Общо получи следната картина:

Поради закръгляване на третия ред между зъбно колело 4 и четири пространства вместо три (I счита един символ = 10 точки, но счита елементи, които нямат ширина, така че вместо 20 и 40 в въпрос трябва да се постави константи 40 и 60).

Надяваме се посочват ясно.

Update: Технически, можете след поддървета дистрибуция така изглежда за тези поддървета, които могат да бъдат преместени във вътрешността на дисплея, без да пречи на останалите, и ако проблемът е тук, то тогава наистина не е, защото след поставянето на поддървета се получи най-компактна версия на поставянето на цялото дърво ширина, а ако някои от поддървета може да бъде преместен, т.е. те имат набор от разрешени позиции, можете да използвате съществуващия си алгоритъм. А фактът, че едно дърво, в резултат на много обемисти в ширина, това не е проблем, тъй като такава.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!