Nejkratší pobočka v binárním stromu?

hlasů
1

Binární strom může být kódovány pomocí dvou funkcí la r taková, že pro node n, l(n)dát levou dítě n, r(n) dát tu správnou dítě n.

Větev stromu je cesta z kořene do listu, délka větví na určitém listu je počet oblouků na cestě od kořene k tomuto listu.

Nechť MinBranch(l,r,x)být jednoduchý rekurzivní algoritmus pro přijetí binární strom kódovaného L a R. funkce spolu s na kořenový uzel x pro binárního stromu a vrací délku nejkratší větve binárního stromu.

Dej pseudokód pro tento algoritmus.

OK, takže v podstatě to je to, co jsem přišel s tak daleko:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Je zřejmé, že to není velký nebo dokonalé. Byl bych vděčný, kdyby lidé mi může pomoci dostat toto dokonalé a funkční - jakoukoliv pomoc ocení.

Položena 28/08/2009 v 05:07
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
3

Pochybuji, že někdo bude řešit úkoly pro vás rovný-up. Klíč: návratová hodnota jistě růst vyšší, než je strom dostane větší, že jo? Nicméně nevidím žádné číselné literály ve své funkci až 0 ° C, a bez přidání operátoři buď. Jak budete někdy vrátí větší množství?

Další úhel pohledu na stejné téma: kdykoli budete psát rekurzivní funkce, pomáhá vyjmenovat „co jsou splněny všechny podmínky, kde bych měl přestat volá sám sebe, co jsem se vrátil v každé okolnosti?“

Odpovězeno 28/08/2009 v 05:15
zdroj uživatelem

hlasů
2

Jste na správném přístupu, ale nejste úplně tam; Váš rekurzivní algoritmus vždy vrátí 0. (logika je téměř v pořádku, i když ...)

Všimněte si, že délka podoborů je menší než délka pobočky; tak left_onei right_onemělo být 1 + MinBranch....

Steping pomocí algoritmu s některými vzorníků pomůže odhalit off-by-one chyby, jako je tento ...

Odpovězeno 28/08/2009 v 05:16
zdroj uživatelem

hlasů
0

Co jste vytvořili si lze představit jako hledání hloubky první. Avšak vzhledem k tomu, co hledáte (nejkratší větev), nemusí to být nejvíce ÚČINNÁ přístup. Přemýšlet o tom, jak by váš algoritmus hrát na stromě, který byl velmi těžký na levé straně (z kořene), ale měl jen jeden uzel na pravé straně.

Tip: zvážit hledání přístupu do šířky.

Odpovězeno 28/08/2009 v 05:19
zdroj uživatelem

hlasů
0

Jaký máte tam vypadá jako prohledávání do hloubky algoritmus, který bude muset prohledat celý strom před vámi přijít s řešením. co potřebujete, je prohledávání do šířky algoritmus, který lze vrátit, jakmile se najde řešení, aniž by úplný hledání

Odpovězeno 28/08/2009 v 05:19
zdroj uživatelem

hlasů
1

Vypadá to, že téměř ji mít, ale za tento příklad:

      4

   3     5

Při trasování přes MinBranch, uvidíte, že ve své MinBranch(l,r,4)výzvě:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

To dává smysl, koneckonců, 3 je koncový uzel, takže samozřejmě vzdálenost k nejbližšímu uzlu listu je 0. To samé se stane pro right_one.

Ale pak skončit zde:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

ale to je zjevně nesprávné, protože tento uzel (4) není koncový uzel. Váš kód zapomněli počítat aktuální uzel (oops!). Jsem si jistý, že se vám podaří napravit.


Nyní, ve skutečnosti, že způsob, jak děláte to není nejrychlejší, ale nejsem si jistý, jestli je to relevantní pro toto cvičení. Vezměme si tento strom:

         4
       3   5
     2
   1

Algoritmus bude počítat na levé pobočku rekurzivně, i když by to mohlo hypoteticky, vylévat pokud nejprve počítal pravou větev a poznamenal, že má 3 doleva, takže je zřetelně delší než 5 (což je list). Ale, samozřejmě, počítat správnou pobočku jako první vždy nefunguje!

Namísto toho se složitější kód, a pravděpodobně kompromis větší využití paměti, můžete zkontrolovat uzlů zleva doprava, top-k-dolní části (stejně jako anglické pořadí čtení) a zastaví na první list najdete.

Odpovězeno 28/08/2009 v 05:20
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more