Всички произволни дърво сродени възли са раздалечени чрез динамично определяне стойност (в този случай 20), както и съседните възли (в този случай 40). В момента, когато се формира най-левия клон, то е причинено rasstonovka_uzlov метод, по който се предава на най-левия и горния десен разликата и която се е увеличила разликата между тях (в случая 20).
Това е, което се случва в rasstonovka_uzlov метода -
- линия се простира от горния ляв до горния десен и помисли интервали (в този случай, шест празни клетки, които, както е посочено по-рано от 20, което означава, че сумата от 120);
- разделяне на сумата, получен в предишния етап на броя възли плюс един (120/3 = 40);
- провери как текущия възел (аз съм се започне от ляво на дясно и на текущия възел е този, който има две деца) е изпратен от левия възел-брат (в този случай 80).
- Сега извадете 80-40 = 40, стойността е разстоянието, на което аз съм на текущия възел е пристрастен да е на правилното място.
- Ако тази стойност (40) е по-голяма от тази, при която се увеличава разстоянието между двете крайни възли, тази стойност става по-малък. Това се изчислява, че 40, но това вече не е активиран, а стойността се променя до 20.
- Аз се движат възел.
Повторете предходните шест стъпки към следващия възел -
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: Технически, можете след поддървета дистрибуция така изглежда за тези поддървета, които могат да бъдат преместени във вътрешността на дисплея, без да пречи на останалите, и ако проблемът е тук, то тогава наистина не е, защото след поставянето на поддървета се получи най-компактна версия на поставянето на цялото дърво ширина, а ако някои от поддървета може да бъде преместен, т.е. те имат набор от разрешени позиции, можете да използвате съществуващия си алгоритъм. А фактът, че едно дърво, в резултат на много обемисти в ширина, това не е проблем, тъй като такава.
Свързани статии