Hogyan gondoskodik egy tetszőleges facsomópontok verem túlcsordulás orosz
Bármilyen tetszőleges fa testvér csomópontok vannak egymástól dinamikusan beállítási érték (ebben az esetben 20), valamint a szomszédos csomópont (ebben az esetben 40). Abban a pillanatban, amikor a bal szélső ága van kialakítva, ez okozza rasstonovka_uzlov eljárás, amelyben továbbított bal felső és jobb felső különbség, és amely növelte a különbség köztük (ebben az esetben 20).
Ez történik az eljárás rasstonovka_uzlov -
- hurok nyúlik ki a bal felső a jobb felső és úgy időközönként (ebben az esetben hat üres cellákat, amelyek, mint azt korábban 20, azaz az összeg 120);
- összegét elosztjuk a kapott az előző lépésben a csomópontok száma plusz egy (120/3 = 40);
- ellenőrizze, hogy a jelenlegi csomópont (Kezdek balról jobbra és a jelenlegi csomópont az egyetlen, aki két gyermek) küldenek a bal node-testvér (ebben az esetben 80).
- Most vonjuk 80-40 = 40, az érték azt a távolságot, amely én vagyok az aktuális csomópont van feszítve, hogy a megfelelő helyre.
- Ha ez az érték (40) nagyobb, mint amelynél növelte a távolság a két végponti csomópont, ez az érték kisebb lesz. Ez a számítások szerint 40, de ez már nem engedélyezett, és ez az érték változik 20.
- Mozgok a csomópontot.
Ismételje meg az előző hat lépést a következő csomóponthoz -
1. kap 60
2. 60/2 = 30
3. 40
4. 30
5. 10
6.
Látod, hogy én átlagosan? Először is, kitalálni, hogy mit kell mozgatni, hogy a negyven, de mivel a negyven lépés, nem tudom (sérti a gyermekek jogait az aljára, akkor lehet közelebb, mint negyven), azt eltolódott a maxim lehetséges húsz. És akkor mozgok már tíz.
Például, ha az első feldolgozási csomópont nem volt gyerek, akkor a kép a következő lenne -
Csak abban az esetben, ha azt előbb csomópont, amely lehet mozgatni a „mennyi valami” (gyermek nélkül), majd azt, amit nem lehet tolódott „mennyit valamit”, akkor a második voltam megint eltolódott a legnagyobb, de ugyanakkor csinál algoritmus az elejétől (vagy inkább az utolsó ismert jó pont), de idővel, hogy helyettesítse a jobb felső áram.
Azt mutatják a kódot, de nem akarom, hogy nézz a hiányosságokat, és csak azt akarom, hogy megértsék a jelentését.
Itt van. De aztán futott be a következő probléma, és lehet, hogy csak egy.
A bemeneti adatok ugyanazok, de lerobban. Algoritmus, ahogy szerettem volna, nem jött be, és még jön, nem tudok.
Az alábbiakban a végeredmény -
Ez a csomópont
francia - az értéket, amely a jelenlegi csomópont eltávolítjuk a korábbi || -> | |
leftOffset - az értéket, amit a bal oldalra kerül. Az elején azt rightOffset = nulla az érték, amely jobbra tolódik. És azt is, alapértelmezés szerint nulla.
Itt van. Csomópontok magukat, mint a közönséges csomópontok, ssydka hogy Parenti, amelyben ezek tárolják egy indexelt tömb. Vannak módszerek csomópontok az index, és így maga az index.
Általánosságban elmondható, hogy szükség van, hogy gondoskodjon a csomópontok után már az a tény, nem pedig felforgatta a dviganiem bármilyen keretet. Két állandók „testvérek” és a „szomszédok”, és a „szomszédok” határozza meg, hogy mennyit kell lenniük egymástól a szomszédos részfák az alacsonyabb szinteken, mint az első, és a „testvérek” - az elsőt. Akkor a problémát meg kell oldani az alulról felfelé minden részfa első épület minden saját részfák, akkor építünk poderevo jelenlegi számított minden a következő részfa minimális elmozdulás a talajhoz képest, ahol minden szinten a részfa nem zavarja a már megállapított részfákat. Ennek eredményeként minden poderevo lesz a „elfoglalt tartomány” minden szinten, ahol van legalább egy lapot, és ez fog menni összehasonlítása a jelenlegi elhelyezése részfa a felső szinten.
Ie Az algoritmus a következő:
jobb befejeződött a következő: adva részfa i-m szinten nem töltve, az i + 1-m jobb szint nem változott, és ha joga van küldtek elérhetővé válik eltolás plusz jobb. A balra van töltve hasonló módon, de csak akkor, ha tele ezen a szinten még nem fejezte be -, mint az új részfák dobavlyayustya jobbra, az első részfájának egy adott mélységben fogja meghatározni a bal részfa. Amikor végző positionRoot () a teljes tömb jobb és bal oldali csökkent helyzetben, majd a felső tömb 0 adunk hozzá.
Megpróbálom leírni a kibontakozó az algoritmust. A leírás, a fa fog használni Lisp listák száma - listák, listák - részfákat. Példa: ((1) (2 3 4 5)) felel meg, egy ilyen fa:
Kezdeti fa: (((1) 2) (((3))) ((4 5 6) ((7 8 9) (10)))). Részfák egyetlen lapból nem tekintve, minden ok nélkül. A részfa ((1) 2) értéke: bal = [0, -10, -10]; jobbra = [0,10, -10], és az alábbi formában:
A csillagok jelzik csúcsok részfák, mivel nincs elem a listákat „root”. A részfa (((3))) van egy triviális formában tömbök és az értéket a bal = [0,0,0,0]; jobbra = [0,0,0,0]. A részfa ((7 8 9) (10)) értéke tömbök maradt = [0, -30, -50]; jobbra = [0,30,30] és így néz ki:
Annak a ténynek köszönhetően, hogy a részfa (7 8 9) kapunk a megfelelő [1], mint a 20 és ofszet "szomszédok" 40, a második részfáját ra helyeztük eltolt 60 (0 + 40 + 20), és a positionRoot okozta offset 30 ( = 60/2), végül sikerült a bal részfa mínusz viszonyítva a teljes Crohn -50. részfa 4-10 szerelvény fog kinézni:
LIMITER jobb részfa helyzetben itt van a második réteg, ahol y (4 5 6) jobb [1] = 20, és a bal [1] -30 részfa, teljes teljes elmozdulás 90. A legalacsonyabb szinten a bal részfa nem elemek, így miss. Ennek eredményeként positionRoot okoz majd a 55. pozícióban, és a teljes tömböt úgy néz ki, mint a bal = [0, -55, -75,5]; jobbra = [0,55,85,85]. Ezután a szerelvény a három részfák fog épülni a következő: az első van elhelyezve eltolt 0, a második (((3))) eltolásnál 50, és egy nagy harmadik eltolódása 50 + 40 + (- 75) = 165, és a fej kiszorítja 87,5 . Összesen kap a következő kép:
A kerekítés miatt a harmadik sor között, a lánckerék a 4. és négy terek három helyett (I tartják az egyik szimbólum = 10 pont, de tekinthető elemek, amelyeknek nincs szélessége, így ahelyett, hogy a 20 és 40 a kérdéses kell fektetni állandók 40 és 60).
Remélhetőleg jól magyarázható.
Frissítés: Technikailag, akkor elosztása után részfákat ezért keressük azokat részfák amely lehet mozgatni benne a kijelző ne zavarja a többi, és ha a probléma van, akkor tényleg nem, mert miután az elhelyezése a részfák kapott legkompaktabb változatát elhelyezése az egész fát szélesség, és ha néhány, a részfák lehet mozgatni, azaz Van egy sor megengedett pozíciók, akkor használja a meglévő algoritmus. És az a tény, hogy egy fa eredményeként egy nagyon terjedelmes szélessége, ez nem probléma, mint olyan.