AIUTO Algoritmo su alberi binari di ricerca BST efficiente

di il
7 risposte

AIUTO Algoritmo su alberi binari di ricerca BST efficiente

Premetto che ho letto il regolamento prima di postare e non potrei chiedervelo, però non so proprio più a chi chiedere...

Il problema è questo:
Sia dato un albero binario di ricerca T, i cui nodi contengono esclusivamente una chiave intera, un puntatore al figlio sinistro e uno al destro.
Si definisca un algoritmo efficiente che, dati i valori interi h1>=1, h2>=1, k1>=0, k2>=0, cancelli dall' albero T tutti i nodi che , nell' albero fornito in ingresso, soddisfano la seguente proprietà:

hanno chiave k pari tale che k1<=k<=k2 e sono radici di sottoalberi il cui percorso esterno ha lunghezza h che soddisfa h1<=h<=h2

Si ricorda che la lunghezza del percorso esterno in un albero radicato nel nodo x è la somma delle lunghezze dei percorsi da x a foglia.

nota: non è possibile utilizzare parametri passati per riferimento nè variabili globali.

Solitamente il prof vuole qualcosa di efficiente è non va bene che ogni volta che un nodo soddisfa la proprietà vado a calcolarmi la somma dei percorsi, solitamente usiamo lo ricorsione non lineare per arrivare alle foglie e risalendo poi ci ritorniamo i valori che ci servono, ma quest' esercizio mi sta uccidendo.. non riesco a pensare nulla di efficiente, qualcuno di buon cuore che gli và di perdere 10 minuti? grazie...

7 Risposte

  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Immagino che usi una funzione ricorsiva a cui passi il nodo da esaminare (la quale a sua volta ispeziona i nodi figli).
    Ovviamente questa funzione riceve come parametro anche il valore della chiave k.
    Se tu passassi come parametro aggiuntivo anche il valore del livello? All' inizio passi 1 e ad ogni chiamata ai nodi inferiori incrementi di uno. All' interno della funzione sapresti sempre a che livello ti trovi (sarebbe un passagio per valore e non per riferimento quindi è valido).

    Spero sia utile come suggerimento, ciao.
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Ci avevo pensato ad una cosa del genere, solo che quando trovo un nodo candidato all' eliminazione, le altezze dei percorsi che devo sommare partono da quel nodo, invece facendo come dici tu è proprio l' altezza corrente dell' albero.. non so se mi sono spiegato bene..
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Sorry, avevo capito il contrario.
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Però non capisco, per calcolare il percorso esterno (somma dei percorsi che portano a tutti i figli) devi esplorare i figli, non mi sembra ci siano alternative, o sbaglio?

    Ovviamente non è che quando un nodo potrebbe essere da eliminare perche soddisfa la condizione sulla chiave, calcoli il percorso esterno e poi se non è da eliminare prosegui l' algoritmo sui figli, ma fai l' eliminazione del nodo nella fase di ritorno (la funzione ti restitisce la lunghezza esterna).

    In pratica fai un attraversamento di tutto l' albero e nella fase di risalita elimini i nodi. Puo andare?
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Si qualcosa del genere può andare ma non riesco proprio a capire come calcolare il percorso esterno risalendo..
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Non puoi usare il passaggio per riferimento (il prof. lo vieta) quindi puoi avere questa informazione solo nel valore restituito dalla funzione.
    La funzione che esplora l' albero (quella ricorsiva) potrebbe calcolare il percorso esterno sommando 1 al valore restituito dai figli e lo restituisce al chiamante.

    Bisognerebbe provare a scrivere due righe di codice, ma ora non è un buon momento. Ci risentiamo.
  • Re: AIUTO Algoritmo su alberi binari di ricerca BST efficiente

    Lo posto, perchè può interessare a qualcuno, cmq dei miei amici che sono andati a ricevimento hanno scoperto che l' unico modo per risolvere l' algoritmo non è nulla di assurdo, una volta trovato il nodo si va a fare il controllo sul percorso esterno, non era possibile calcolare il percorso esterno risalendo man mano l' albero

    una cose del genere per intenderci..

    algo(T,K1,K2,H1,H2)
    IF T != NIL THEN
    ALGO(T->SX)
    ALGO(T->DX)

    IF (T->KEY%2=0) AND (K1<=T->KEY<=K2) THEN
    PERCORSO_ESTERNO=PE(T,0)
    IF H1<=PERCORSO_ESTERNO<=H2 THEN
    T=CANCELLA(T,P)



    PE(T,H)
    IF T!=NIL THEN
    IF(T->SX=NIL AND T->DX=NIL) THEN
    RETURN H
    ELSE RETURN PE(T->SX,H+1)+PE(T->DX,H+1)
    ELSE RETURN 0
Devi accedere o registrarti per scrivere nel forum
7 risposte