Conceitos básicos de árvores
Uma árvore é uma estrutura de dados hierárquica que consiste em nós conectados entre si de acordo com relacionamentos hierárquicos. As árvores têm os seguintes conceitos básicos:
-
Nó raiz : o nó superior da árvore, que não possui nó pai.
-
Nós filhos : cada nó na árvore pode ter zero ou mais nós filhos.
-
Nó folha : um nó sem nós filhos é chamado de nó folha.
-
Nó pai : todo nó pode ter um nó pai, exceto o nó raiz.
-
Profundidade : O nível em que um nó está localizado é chamado de profundidade. O nó raiz tem profundidade 0, seus nós filhos têm profundidade 1 e assim por diante.
Definição de árvore binária e árvore de pesquisa binária (BST)
Uma árvore binária é um tipo especial de árvore em que cada nó tem no máximo dois filhos: um filho esquerdo e um filho direito.
**Binary Search Tree (BST)** é uma árvore binária na qual cada nó segue as seguintes regras:
-
O valor de todos os nós na subárvore esquerda é menor que o valor do nó atual.
-
O valor de todos os nós na subárvore direita é maior que o valor do nó atual.
Essa ordem torna as árvores de busca binária adequadas para operações de busca e classificação.
Método de passagem de árvore
Atravessar uma árvore significa visitar os nós da árvore em uma determinada ordem. Três métodos comuns de travessia de árvores são os seguintes:
-
Travessia de pré-ordem : primeiro visite o nó raiz e, em seguida, percorra a subárvore esquerda e a subárvore direita em ordem.
-
Percurso em ordem : primeiro percorra a subárvore esquerda, depois visite o nó raiz e, finalmente, percorra a subárvore direita. A travessia em ordem pode ser usada para classificar o BST.
-
Percurso pós-ordem : primeiro percorra a subárvore esquerda, depois percorra a subárvore direita e, finalmente, visite o nó raiz.
Aqui está um exemplo simples de C++ para criar uma árvore binária e realizar travessia em ordem:
#include <iostream>
// 二叉树节点定义
struct TreeNode {
int data; // 节点数据
TreeNode* left; // 左子节点
TreeNode* right; // 右子节点
};
// 中序遍历函数
void inOrderTraversal(TreeNode* root) {
if (root != nullptr) {
inOrderTraversal(root->left);
std::cout << root->data << " ";
inOrderTraversal(root->right);
}
}
int main() {
// 创建二叉树
TreeNode* root = new TreeNode{
1, nullptr, nullptr};
root->left = new TreeNode{
2, nullptr, nullptr};
root->right = new TreeNode{
3, nullptr, nullptr};
// 中序遍历
inOrderTraversal(root);
return 0;
}
resultado da operação:
Perguntas práticas:
-
Qual é a diferença entre uma árvore binária e uma árvore binária de pesquisa? Quando você escolheria usar uma árvore de pesquisa binária?
-
Explique o conceito de travessia em ordem. Por que o percurso em ordem é útil em árvores de pesquisa binária?
-
Descreve uma situação em que uma estrutura em árvore é mais adequada para armazenar e organizar dados do que uma estrutura de dados linear, como uma matriz ou lista vinculada.
-
Escreva um programa C++ que crie uma árvore binária simples e execute uma travessia em ordem para gerar o valor do nó.
Qual é a diferença entre uma árvore binária e uma árvore binária de pesquisa? Quando você escolheria usar uma árvore de pesquisa binária?
-
Diferença : A principal diferença é a ordem. Uma árvore binária é uma estrutura em árvore com cada nó tendo no máximo dois nós filhos. A árvore de pesquisa binária (BST) é uma árvore binária especial ordenada. No BST, o valor de todos os nós na subárvore esquerda é menor que o valor do nó atual e o valor de todos os nós na subárvore direita é maior que o valor do nó atual.
-
Casos ao escolher BST : Os casos em que você escolheria usar o BST incluem quando são necessárias operações eficientes de pesquisa e classificação. A natureza ordenada do BST torna a operação de busca muito rápida, com uma complexidade de tempo média de O(log n), onde n é o número de nós na árvore. Além disso, o BST também pode ser usado para implementar aplicações como dicionários e índices de bancos de dados que exigem busca e inserção rápidas.
Explique o conceito de travessia em ordem. Por que o percurso em ordem é útil em árvores de pesquisa binária?
-
A travessia em ordem é um método de travessia de árvore. Seu conceito básico é percorrer os nós da árvore na ordem de subárvore esquerda, nó raiz e subárvore direita. Na travessia em ordem, todos os nós da subárvore esquerda são primeiro percorridos, depois o nó raiz é visitado e, finalmente, todos os nós da subárvore direita são percorridos.
-
A importância da travessia em ordem no BST : No BST, a travessia em ordem pode acessar os nós da árvore em ordem crescente. Isso significa que uma sequência ordenada de nós pode ser obtida por meio de travessia em ordem. Portanto, o percurso em ordem é muito útil no BST, que pode ser usado para implementar operações de classificação na árvore, e também pode ser usado para operações de pesquisa, porque o valor alvo pode ser encontrado rapidamente na sequência ordenada.
Descreve uma situação em que uma estrutura em árvore é mais adequada para armazenar e organizar dados do que uma estrutura de dados linear, como uma matriz ou lista vinculada.
- Exemplo de cenário : Organizando um sistema de arquivos. Os sistemas de arquivos geralmente usam uma estrutura em árvore para organizar arquivos e pastas. Cada pasta pode conter arquivos e outras pastas, formando uma estrutura em árvore na qual o nó raiz representa o diretório de nível superior e os nós folha representam os arquivos. Essa estrutura em árvore torna o sistema de arquivos fácil de organizar, pesquisar e acessar arquivos.
Nota: Uma estrutura em árvore é mais adequada neste caso porque pode representar claramente o relacionamento hierárquico e a estrutura organizacional entre arquivos, enquanto estruturas de dados lineares (como arrays) geralmente são insuficientes para representar esta complexidade.
Escreva um programa C++ que crie uma árvore binária simples e execute uma travessia em ordem para gerar o valor do nó.
Crie uma árvore binária e execute a travessia em ordem:
#include <iostream>
// 二叉树节点定义
struct TreeNode {
int data; // 节点数据
TreeNode* left; // 左子节点
TreeNode* right; // 右子节点
};
// 中序遍历函数
void inOrderTraversal(TreeNode* root) {
if (root != nullptr) {
inOrderTraversal(root->left);
std::cout << root->data << " ";
inOrderTraversal(root->right);
}
}
int main() {
// 创建二叉树
TreeNode* root = new TreeNode{
4, nullptr, nullptr};
root->left = new TreeNode{
2, nullptr, nullptr};
root->right = new TreeNode{
6, nullptr, nullptr};
root->left->left = new TreeNode{
1, nullptr, nullptr};
root->left->right = new TreeNode{
3, nullptr, nullptr};
root->right->left = new TreeNode{
5, nullptr, nullptr};
root->right->right = new TreeNode{
7, nullptr, nullptr};
// 中序遍历
inOrderTraversal(root);
return 0;
}
resultado da operação:
Este programa cria uma árvore binária simples e imprime os valores dos nós usando travessia em ordem.