Criando um zipper para uma árvore binária.
Os zippers são uma maneira puramente funcional de navegar dentro de uma estrutura de dados e de manipulá-la. Essencialmente, eles contêm uma estrutura de dados e um ponteiro para dentro dessa estrutura de dados (chamado de foco).
Por exemplo, dada uma rose tree (em que cada nó contém um valor e uma lista de nós filhos), um zipper pode dar suporte a estas operações:
from_tree (obtém um zipper a partir de uma rose tree, o foco fica no nó raiz)to_tree (obtém a rose tree de volta a partir do zipper)value (obtém o valor do nó em foco)prev (move o foco para o filho anterior do mesmo pai,
retorna um novo zipper)next (move o foco para o próximo filho do mesmo pai, retorna um
novo zipper)up (move o foco para o pai, retorna um novo zipper)set_value (define o valor do nó em foco, retorna um novo zipper)insert_before (insere uma nova subárvore antes do nó em foco, ela
passa a ser o prev do nó em foco, retorna um novo zipper)insert_after (insere uma nova subárvore depois do nó em foco, ela passa
a ser o next do nó em foco, retorna um novo zipper)delete (remove o nó em foco e todas as subárvores, o foco vai para o
nó next se possível, caso contrário para o nó prev se possível,
caso contrário para o nó pai, retorna um novo zipper)Você vai encontrar uma classe Tree já implementada para você. Sua tarefa é escrever a classe Zipper.
Crie sua conta no Exercism para aprender e dominar Tcl com 135 exercícios e mentoria humana de verdade, tudo de graça.