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.