Escreva uma função que exclui todos os nós de uma árvore binária NÃO ordenada com ID par.
Passo 1
A tarefa é criar uma função que percorra toda a árvore binária e exclua (libere da memória) qualquer nó cujo campo ID seja par. Para isso a gente vai usar recursão em pós-ordem (visitar filhos antes de processar o próprio nó) e um procedimento auxiliar que libera completamente um subtipo de árvore.
Passo 2
Primeiro, vamos escrever uma função auxiliar freeSubtree que recebe a raiz de um subtipo de árvore e libera todos os nós dela em pós-ordem. Essa função percorre recursivamente esquerda e direita e depois chama free no nó.
Passo 3
Depois, implementamos a função principal removeEven que recebe a raiz da árvore original. Se a raiz for nula, retornamos nulo. Se o ID da raiz for par, chamamos freeSubtree na raiz inteira (para liberar todos os descendentes) e retornamos nulo. Caso contrário, aplicamos recursão em pós-ordem: atualizamos root->left e root->right chamando removeEven e, no fim, retornamos root.
Passo 4
Com isso, toda vez que encontrarmos um nó com ID par, liberamos imediatamente aquele subtipo de árvore, e garantimos que a árvore resultante não contenha mais esses nós.
Resposta
// Estrutura básica de nó
typedef struct Node {
int id;
struct Node *left;
struct Node *right;
} Node;
typedef struct Node {
int id;
struct Node *left;
struct Node *right;
} Node;
// Função auxiliar que libera toda uma subárvore em pós-ordem
void freeSubtree(Node *root) {
if (!root) return;
freeSubtree(root->left);
freeSubtree(root->right);
free(root);
}
void freeSubtree(Node *root) {
if (!root) return;
freeSubtree(root->left);
freeSubtree(root->right);
free(root);
}
// Função que remove todos os nós com ID par de uma árvore não ordenada
Node* removeEven(Node *root) {
if (!root) return NULL;
// Se o nó atual tiver ID par, libera toda a subárvore e retorna NULL
if (root->id % 2 == 0) {
freeSubtree(root);
return NULL;
}
// Senão, limpa recursivamente os filhos
root->left = removeEven(root->left);
root->right = removeEven(root->right);
return root;
}
Node* removeEven(Node *root) {
if (!root) return NULL;
// Se o nó atual tiver ID par, libera toda a subárvore e retorna NULL
if (root->id % 2 == 0) {
freeSubtree(root);
return NULL;
}
// Senão, limpa recursivamente os filhos
root->left = removeEven(root->left);
root->right = removeEven(root->right);
return root;
}