Zipper

Zipper

Difícil

Instruções

Criar um zipper para uma árvore binária.

Os zippers são uma forma puramente funcional de navegar dentro de uma estrutura de dados e de a manipular. Contêm essencialmente uma estrutura de dados e um ponteiro para dentro dessa estrutura de dados (chamado foco).

Por exemplo, dada uma árvore rosa (em que cada nó contém um valor e uma lista de nós filhos), um zipper pode suportar estas operações:

  • from_tree (obtém um zipper a partir de uma árvore rosa; o foco fica no nó raiz)
  • to_tree (obtém a árvore rosa a partir do zipper)
  • value (obtém o valor do nó em foco)
  • prev (move o foco para o filho anterior do mesmo pai; devolve um novo zipper)
  • next (move o foco para o filho seguinte do mesmo pai; devolve um novo zipper)
  • up (move o foco para o pai; devolve um novo zipper)
  • set_value (define o valor do nó em foco; devolve um novo zipper)
  • insert_before (insere uma nova subárvore antes do nó em foco; esta passa a ser o prev do nó em foco; devolve um novo zipper)
  • insert_after (insere uma nova subárvore depois do nó em foco; esta passa a ser o next do nó em foco; devolve um novo zipper)
  • delete (remove o nó em foco e todas as subárvores; o foco passa para o nó next se possível, caso contrário para o nó prev se possível, caso contrário para o nó pai; devolve um novo zipper)
Editar via GitHub A ligação abre numa nova janela ou separador
Clojure Exercism

Estás pronto para começar Zipper?

Inscreve-te no Exercism para aprenderes e dominares Clojure com 12 conceitos105 exercícios, e mentoria humana real, tudo grátis.