Portanto, antes de ler alguns conceitos básicos de ciência da computação.
- Uma árvore binária é uma estrutura alocada dinamicamente (geralmente usada para armazenamento ordenado).
- Por causa de sua natureza, a travessia de árvores binárias geralmente é recursiva;
Isso ocorre porque o deslocamento linear (via loop) não é natural quando existem duas vias de loop.- Recursiva: significa uma função que se chama.
- Em idiomas antiquados, o gerenciamento de memória requer gerenciamento manual de memória.
- Manual: significa que você deve fazer isso sozinho.
- Ao fazer o gerenciamento manual da memória, você precisa solicitar ao sistema subjacente para liberar cada membro da árvore.
- Livre: recupere a memória para os poos globais, para que possa ser reutilizada e você não fique sem memória.
- Liberando: isso é feito chamando a função
free()
e passando o ponteiro que você deseja recuperar. - Ponteiro: É como um bastão virtual. No final está a memória. Quando você pede memória, você recebe um ponteiro (stick virtual) que possui memória. Ao terminar, você devolve o ponteiro (bastão virtual).
A solução recursiva:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
O problema é que recursão significa que você está repetidamente chamando a mesma função. Isso aumenta a pilha. Aumentar a pilha usa mais memória. A razão pela qual você está liberando a árvore é que você deseja recuperar a memória usando mais memória é contraproducente (mesmo que você recupere os dois bits de memória).
Por fim, a pergunta:
Portanto, o problema gira em torno da conversão da versão recursiva acima em uma solução linear (para que você não precise usar memória).
Dê ao tipo de nó
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Escreva uma função para liberar uma árvore desses nós.
Restrições:
- Não é possível usar recursão (nem indiretamente)
Não é possível alocar nenhum espaço dinâmico para rastreamento.
Observe que existe uma solução O (n)
Vencedora:
- Melhor complexidade.
- Tie Break 1: Primeiro enviado
- Tie Break 2: Menor quantidade de caracteres.
fonte
C99, 94, O (n)
Edit: todo mundo parece se referir
struct Node
apenasNode
como se otypedef
ed, assim como eu fiz.este é realmente o meu primeiro golfe C. muitas segfaults.
de qualquer forma, isso requer C99 porque ele usa uma declaração dentro da primeira instrução de um loop for.
nem usando
#define
!esse algoritmo funciona transformando a árvore para que o nó superior não tenha filho esquerdo e, em seguida, excluindo-o e passando para o filho certo.
por exemplo, se começarmos com a árvore
o algoritmo mudará os ponteiros para que a árvore seja
agora podemos excluir o nó superior facilmente.
fonte
Caracteres C / C ++ / Objective-C 126 (inclui nova linha à direita necessária)
Não é executado no tempo O (n). Mas o OP não exige, então aqui está minha solução O (n 2 ).
Algoritmo: Desça até uma folha da raiz. Solte-o. Repita até que não haja folhas. Solte a raiz.
Ungolfed:
fonte
c ++ 99 O (n)
Os loops aqui são ótimos para encadear ao longo de uma lista, mas não para subir e descer hierarquias. user300 conseguiu (estou impressionado), mas o código é difícil de ler.
A solução é converter a árvore em uma lista.
O truque é fazer isso ao mesmo tempo em que você exclui os nós.
Versão Golf
Golf Expanded
fonte
C, 150 bytes
Experimente no JDoodle
fonte