#include <stdio.h>
#include <stdlib.h>
// Definição da estrutura do nó da árvore
struct Node {
int data;
int height; // Fator de balanceamento
struct Node* left;
struct Node* right;
};
// Função para criar um novo nó
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->height = 1;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// Função para calcular a altura da árvore
int calculateHeight(struct Node* root) {
if (root == NULL) {
return 0; // Árvore vazia tem altura 0
}
// Calcule a altura das subárvores esquerda e direita
int leftHeight = calculateHeight(root->left);
int rightHeight = calculateHeight(root->right);
// A altura da árvore é a maior altura entre as subárvores mais 1 para contar o nível atual
root->height = 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
return root->height;
}
// Função para inserir um novo nó na árvore
struct Node* insertNode(struct Node* root, int data) {
if (root == NULL) {
return createNode(data);
}
if (data < root->data) {
root->left = insertNode(root->left, data);
} else if (data > root->data) {
root->right = insertNode(root->right, data);
}
// Recalcule o fator de balanceamento após a inserção
calculateHeight(root);
return root;
}
// Função para calcular o número de nós na árvore
int countNodes(struct Node* root) {
if (root == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
// Função para imprimir as folhas na ordem "esquerda-raiz-direita"
void printLeaves(struct Node* root) {
if (root == NULL) {
return;
}
// Primeiro, verifique se o nó atual é uma folha (não tem filhos)
if (root->left == NULL && root->right == NULL) {
printf("%d ", root->data); // Imprima o conteúdo da folha
}
// Em seguida, chame a função para os filhos esquerdo e direito
printLeaves(root->left);
printLeaves(root->right);
}
int main() {
struct Node* root = NULL;
// Inserir 5 nós com valores aleatórios na árvore
root = insertNode(root, 10);
root = insertNode(root, 5);
root = insertNode(root, 15);
root = insertNode(root, 3);
root = insertNode(root, 7);
// Calcular o número de nós na árvore e imprimir o resultado
int numNodes = countNodes(root);
printf("Número de nós na árvore: %d\n", numNodes);
// Imprimir as folhas na ordem "esquerda-raiz-direita"
printf("Folhas na ordem e-r-d: ");
printLeaves(root);
printf("\n");
// Calcular a altura da árvore e atualizar o fator de balanceamento em cada nó
calculateHeight(root);
printf("Altura da árvore: %d\n", root->height);
return 0;
}
1. #include <stdio.h>
#include <stdlib.h>
// Definição da estrutura do nó da árvore
struct Node {
int data;
int height; // Fator de balanceamento
struct Node* left;
struct Node* right;
};
// Função para criar um novo nó
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->height = 1;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// Função para calcular a altura da árvore
int calculateHeight(struct Node* root) {
if (root == NULL) {
return 0; // Árvore vazia tem altura 0
}
// Calcule a altura das subárvores esquerda e direita
int leftHeight = calculateHeight(root->left);
int rightHeight = calculateHeight(root->right);
2. // A altura da árvore é a maior altura entre as subárvores mais 1 para contar o nível atual
root->height = 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
return root->height;
}
// Função para inserir um novo nó na árvore
struct Node* insertNode(struct Node* root, int data) {
if (root == NULL) {
return createNode(data);
}
if (data < root->data) {
root->left = insertNode(root->left, data);
} else if (data > root->data) {
root->right = insertNode(root->right, data);
}
// Recalcule o fator de balanceamento após a inserção
calculateHeight(root);
return root;
}
// Função para calcular o número de nós na árvore
int countNodes(struct Node* root) {
if (root == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
3. }
// Função para imprimir as folhas na ordem "esquerda-raiz-direita"
void printLeaves(struct Node* root) {
if (root == NULL) {
return;
}
// Primeiro, verifique se o nó atual é uma folha (não tem filhos)
if (root->left == NULL && root->right == NULL) {
printf("%d ", root->data); // Imprima o conteúdo da folha
}
// Em seguida, chame a função para os filhos esquerdo e direito
printLeaves(root->left);
printLeaves(root->right);
}
int main() {
struct Node* root = NULL;
// Inserir 5 nós com valores aleatórios na árvore
root = insertNode(root, 10);
root = insertNode(root, 5);
root = insertNode(root, 15);
root = insertNode(root, 3);
root = insertNode(root, 7);
// Calcular o número de nós na árvore e imprimir o resultado
int numNodes = countNodes(root);
printf("Número de nós na árvore: %dn", numNodes);
4. // Imprimir as folhas na ordem "esquerda-raiz-direita"
printf("Folhas na ordem e-r-d: ");
printLeaves(root);
printf("n");
// Calcular a altura da árvore e atualizar o fator de balanceamento em cada nó
calculateHeight(root);
printf("Altura da árvore: %dn", root->height);
return 0;
}