Cea mai scurtă sucursală într-un copac binar?

voturi
1

Un arbore binar poate fi codificate utilizând două funcții lși r astfel încât pentru o node n, l(n)da copilul din stânga a n, r(n) da copilului dreptul de n.

O ramură a unui copac este o cale de la rădăcină la o frunză, lungimea unei ramuri la o anumită frunză este numărul de arce pe drumul de la rădăcină la acea frunză.

MinBranch(l,r,x)fie un algoritm recursiv simplu pentru a lua un arbore binar codificat de funcțiile l și r împreună cu nodul rădăcină x pentru arborele binar și returnează lungimea cea mai scurtă ramură a arborelui binar.

Dă Pseudocodul pentru acest algoritm.

OK, deci, practic, acest lucru este ceea ce am venit cu până acum:

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)}
}

Evident, acest lucru nu este mare sau perfectă. Aș fi recunoscător dacă oamenii pot ajuta să obțin acest lucru perfectă și - orice ajutor va fi apreciat.

Întrebat 28/08/2009 la 05:07
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
3

Ma indoiesc ca cineva va rezolva temele pentru tine direct-up. Un indiciu: valoarea returnată trebuie să crească cu siguranță mai mare copac devine mai mare, nu? Cu toate acestea eu nu văd nici un literali numerice în funcția, cu excepția 0, și nici un operator de adiție, fie. Cum vei întoarce vreodată un număr mai mare?

Un alt unghi pe aceeași problemă: în orice moment să scrii o funcție recursive, ajută la enumerarea „care sunt toate condițiile în care ar trebui să mă opresc mă cheamă ce mă întorc în fiecare circumstanță?“

Publicat 28/08/2009 la 05:15
sursa de către utilizator

voturi
2

Ești pe abordarea corectă, dar tu nu ești destul de acolo; algoritmul recursiv dvs. va reveni întotdeauna 0. (logica este aproape dreaptă, deși ...)

rețineți că lungimea subramurile este una mai mică decât lungimea sucursalei; astfel încât left_oneși right_onear trebui să fie 1 + MinBranch....

Steping prin algoritmul cu niște arbori de probă va ajuta la descoperirea off-de-una erori ca aceasta ...

Publicat 28/08/2009 la 05:16
sursa de către utilizator

voturi
0

Ceea ce ați creat poate fi gândit ca o căutare adancime. Cu toate acestea, având în vedere ceea ce ești după (cel mai scurt ramură), acest lucru nu poate fi abordarea cea mai EFICIENTĂ. Gândiți-vă la modul în care algoritmul dvs. ar realiza pe un copac, care a fost foarte grea pe partea stângă (a nodului rădăcină), dar a avut doar un singur nod de pe partea dreaptă.

Sugestie: ia în considerare o abordare de căutare-lățime mai întâi.

Publicat 28/08/2009 la 05:19
sursa de către utilizator

voturi
0

Ce ai acolo arata ca o adancime primul algoritm de căutare , care va trebui să caute întregul copac înainte de a veni cu o soluție. ceea ce ai nevoie este lățimea prima căutare algoritm care poate reveni imediat ce constată soluția fără a face o căutare completă

Publicat 28/08/2009 la 05:19
sursa de către utilizator

voturi
1

Se pare că aproape că am, dar ia în considerare acest exemplu:

      4

   3     5

Când urmări prin MinBranch, veți vedea că , în dvs. de MinBranch(l,r,4)apel:

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

Acest lucru are sens, la urma urmei, 3 este un nod frunză, astfel încât, desigur, distanța până la cel mai apropiat nod de frunze este 0. Același lucru se întâmplă pentru right_one.

Dar apoi ajungi aici:

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

dar asta e în mod clar greșit, pentru că acest nod (4) nu este un nod frunză. Codul dvs. a uitat să numere nodul curent (oops!). Sunt sigur că puteți gestiona pentru a repara asta.


Acum, de fapt, ei modul în care faci acest lucru nu este cel mai rapid, dar nu sunt sigur dacă asta e relevant pentru acest exercițiu. Luați în considerare acest copac:

         4
       3   5
     2
   1

Algoritmul va conta în sus ramura stânga recursiv, chiar dacă s-ar putea, ipotetic vorbind, cauțiune dacă ați numărat mai întâi ramura dreapta și a remarcat că 3 are o stânga, astfel încât sa în mod clar mai mult de 5 (care este o frunză). Dar, desigur, de numărare ramura dreapta primul nu funcționează întotdeauna!

In schimb, cu codul de mai complicat, și, probabil, un compromis de utilizare a memoriei mai mare, puteți verifica nodurile de la stânga la dreapta, de sus în jos (la fel ca ordine de citire în limba engleză) și se opresc la prima frunză veți găsi.

Publicat 28/08/2009 la 05:20
sursa de către utilizator

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