Larghezza prima attraversamento significa attraversare i livelli di un albero uno per uno. Quindi supponiamo di sapere già quali sono i numeri all'inizio di ogni livello - il numero di elementi attraversati finora prima di ogni livello. Per il semplice esempio nel documento
import Data.Monoid
data Tree a = Tree (Tree a) a (Tree a)
| Empty
deriving (Show)
example :: Tree Char
example = Tree (Tree Empty 'b' (Tree Empty 'c' Empty)) 'a' (Tree Empty 'd' Empty)
le dimensioni sarebbero 0, 1, 3, 4. Sapendo questo, possiamo infilare tale elenco di dimensioni attraverso un albero dare (sub-tree) da sinistra a a destra: avanziamo del primo elemento della lista di uno per il nodo e infiliamo la coda della lista prima attraverso la sinistra e poi attraverso la sottostruttura destra (vedere thread
di seguito).
Dopo averlo fatto, otterremo di nuovo lo stesso elenco di dimensioni, spostato solo di uno: ora abbiamo il numero totale di elementi dopo il ogni livello. Quindi il trucco è: supponiamo di avere un elenco di questo tipo, usarlo per il calcolo e quindi inserire l'output come input - tie the knot.
Un esempio di implementazione:
tagBfs :: (Monoid m) => (a -> m) -> Tree a -> Tree m
tagBfs f t = let (ms, r) = thread (mempty : ms) t
in r
where
thread ms Empty = (ms, Empty)
thread (m : ms) (Tree l x r) =
let (ms1, l') = thread ms l
(ms2, r') = thread ms1 r
in ((m <> f x) : ms2, Tree l' m r')
generalizzato per Monoid
(per la numerazione da darle const $ Sum 1
come la funzione).
fonte
2015-04-20 18:45:14
solo * uno * domanda alla volta –
(La maggior parte del codice in quella carta (incluso lo snippet che hai postato) è in SML.) – Dogbert
@KarolyHorvath ha modificato la domanda – mntk123