<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Busca binária - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Busca binária - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 19:16:39 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/busca-binaria/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Inserção, rotação e fator de balanceamento da árvore AVL explicados ]]>
                </title>
                <description>
                    <![CDATA[ O que é uma árvore AVL? Uma árvore AVL é um tipo de árvore binária de busca. Nomeada em homenagem aos seus criadores, Adelson-Velsky e Landis, as árvores AVL possuem a propriedade de autobalanceamento dinâmico, além de todas as outras propriedades mostradas pelas árvores binárias de busca. Uma árvore binária ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/insercao-rotacao-e-fator-de-balanceamento-da-arvore-avl-explicados/</link>
                <guid isPermaLink="false">635fde827e77d305f28d87b2</guid>
                
                    <category>
                        <![CDATA[ Busca binária ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Felipe Ribeiro Portela ]]>
                </dc:creator>
                <pubDate>Thu, 29 Dec 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/5f9c9f18740569d1a4ca40ca.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/avl-tree-insertion-rotation-and-balance-factor/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">AVL Tree Insertion, Rotation, and Balance Factor Explained</a>
      </p><h2 id="o-que-uma-rvore-avl"><strong>O que é uma árvore AVL?</strong></h2><p>Uma árvore AVL é um tipo de árvore binária de busca. Nomeada em homenagem aos seus criadores, Adelson-Velsky e Landis, as árvores AVL possuem a propriedade de autobalanceamento dinâmico, além de todas as outras propriedades mostradas pelas árvores binárias de busca.</p><p>Uma árvore binária de busca, ou BST (do inglês, <em>binary search tree</em>), é uma estrutura de dados compostas de nós. Ela tem as seguintes garantias:</p><ol><li>Cada árvore possui um nó raiz (no topo)</li><li>O nó raiz tem zero, um ou dois filhos </li><li>Cada nó filho tem zero, um ou dois nós filhos. </li><li>Cada nó tem até dois filhos </li><li>Para cada nó, seus descendentes da esquerda são menores que o nó atual, que é menor que o descendentes da direita</li></ol><p>As árvores AVL têm uma garantia adicional:</p><ol><li>A diferença entre as profundidade das camadas do lado direito e esquerdo não pode ser maior que um. Essa diferença é chamada de fator de balanço.<br><br>Para manter essa garantia, a implementação de uma AVL incluirá um algoritmo para balanceamento da árvore quando a adição de um elemento prejudicar essa garantia. &nbsp;</li></ol><p>As árvores AVL têm uma complexidade de tempo de busca, inserção e exclusão, no pior dos casos, de <code>O(log n)</code>, onde <code>n</code> é o número de nós na árvore. A complexidade de espaço de pior caso é <code>O(n)</code>. </p><h3 id="processo-de-inser-o-na-avl"><strong>Processo de inserção na AVL</strong></h3><p>A inserção em uma árvore AVL é similar à inserção em uma árvore binária de busca. &nbsp;Depois de inserir um elemento, no entanto, você precisa ajustar as propriedades da AVL utilizando rotações para esquerda ou para a direita: </p><ul><li>Se houver um desbalanceamento na subárvore da direita do filho da esquerda do nó, faça uma rotação dupla à direita. </li><li>Se houver um desbalanceamento na subárvore da esquerda do filho da esquerda do nó, faça uma rotação simples à direita. </li><li>Se houver um desbalanceamento na subárvore da direita do filho da direita do nó, faça uma rotação simples à esquerda.</li><li>Se houver um desbalanceamento &nbsp;na subárvore da esquerda do filho da direita do nó, faça uma rotação dupla à esquerda. &nbsp;</li></ul><h2 id="rota-es-da-rvore-avl"><strong>Rotações da árvore AVL</strong></h2><p>Nas árvores AVL, após cada operação, como inserção e exclusão, o fator de balanceamento de cada nó precisa ser verificado. Se cada nó satisfizer a condição do fator de balanceamento, a operação pode ser concluída. Caso contrário, a árvore precisa ser rebalanceada utilizando as operações de rotação. </p><p>Existem quatro rotações e elas são classificadas em dois tipos: </p><h3 id="rota-o-simples-esquerda-rota-o-se-"><strong>Rotação simples à esquerda<strong> (</strong>rotação SE<strong>)</strong></strong></h3><p>Na rotação simples à esquerda, cada nó se move uma posição para a direita da posição atual.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/image-5.png" class="kg-image" alt="image-5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/image-5.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/image-5.png 609w" width="609" height="204" loading="lazy"></figure><h3 id="rota-o-simples-direita-rota-o-sd-">Rotação simples à direita (rotação SD)</h3><p>Na rotação simples à direita, cada nó se move uma posição para a direita da posição atual.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/image-4-1.png" class="kg-image" alt="image-4-1" width="578" height="203" loading="lazy"></figure><h3 id="rota-o-dupla-direita-rota-o-dd-"><strong>Rotação dupla à direita<strong> (</strong>rotação DD<strong>)</strong></strong></h3><p>As rotações duplas à direita são uma combinação de uma única rotação para a esquerda seguida de uma rotação para a direita. <br><br>Primeiro, cada nó se move uma posição para a esquerda. Depois, se move uma posição para a direita da posição atual. </p><h3 id="rota-o-dupla-esquerda-rota-o-de-"><strong>Rotação dupla à esquerda <strong>(</strong>rotação DE<strong>)</strong></strong></h3><p>As rotações duplas à esquerda são uma combinação de uma única rotação para a direita seguida de uma rotação para a esquerda.</p><p>Primeiro, cada nó se move uma posição para a direita. Depois, se move uma posição para a esquerda da posição atual.</p><h2 id="aplica-o-das-rvores-avl"><strong>Aplicação das árvores AVL </strong></h2><p>As árvores AVL são benéficas em casos de bancos de dados, onde inserções e exclusões não são frequentes, mas onde você confere as entradas com frequência.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Árvores binárias de busca: BSTs explicadas com exemplos ]]>
                </title>
                <description>
                    <![CDATA[ O que é uma árvore binária de busca? Uma árvore é uma estrutura de dados composta de nós, com as seguintes características:  1. Cada árvore tem um nó raiz em seu ponto superior (também conhecido como Nó     Pai) contendo algum valor (com qualquer tipo de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/arvores-binarias-de-busca-bst-explicada-com-exemplos/</link>
                <guid isPermaLink="false">624f24976daab205304b0929</guid>
                
                    <category>
                        <![CDATA[ Busca binária ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 08 Apr 2022 00:05:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/04/5f9c9f48740569d1a4ca41c4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/binary-search-trees-bst-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Binary Search Trees: BST Explained with Examples</a>
      </p><h2 id="o-que-uma-rvore-bin-ria-de-busca"><strong>O que é uma árvore binária de busca?</strong></h2><p>Uma árvore é uma estrutura de dados composta de nós, com as seguintes características:</p><ol><li>Cada árvore tem um nó raiz em seu ponto superior (também conhecido como Nó Pai) contendo algum valor (com qualquer tipo de dados).</li><li>O nó raiz tem zero ou mais "nós filhos".</li><li>Cada nó filho tem zero ou mais "nós filhos" e assim por diante. Isso cria uma subárvore interna à árvore. Cada nó tem sua própria subárvore feita dos filhos e dos filhos dos filhos e assim por diante. Isso quer dizer que cada nó pode ser uma árvore por si só.</li></ol><p>Uma árvore binária de busca (ou BST, do inglês <em>binary search tree</em>) tem, além disso, as duas características abaixo:</p><ol><li>Cada nó pode ter, no máximo, dois filhos.</li><li>Para cada nó, os valores de seus descendentes da esquerda são inferiores ao valor do nó atual, que, por sua vez, é inferior aos nós descendentes da direita (se existirem).</li></ol><p>As BST tem como base a ideia do algoritmo de busca binária, que permite uma procura, inserção e remoção rápidas dos nós. A maneira como estão configurados representa, em média, que cada comparação permite que as operações evitem passar por cerca de metade da árvore. Assim, cada procura, inserção ou remoção &nbsp;leva um tempo proporcional ao logaritmo do número de itens armazenados na árvore, <code>O(log n)</code>. Entretanto, em algumas situações, podemos ter o pior dos casos, em que a árvore não está balanceada e a complexidade de tempo passa a ser <code>O(n)</code> &nbsp;para essas três funções. É por isso que árvores autobalanceadas (AVL, rubro-negra etc.) são muito mais eficazes que a BST básica.</p><p><strong>Exemplo de cenário com o pior caso<strong>:</strong></strong> &nbsp;isso pode acontecer quando você segue adicionando nós que são <em>sempre</em> maiores do que o nó anterior (seu pai). A mesma situação pode acontecer quando você <em>sempre </em>adiciona nós com valores inferiores aos de seus nós pai.</p><h3 id="opera-es-b-sicas-em-uma-bst"><strong>Operações básicas em uma BST</strong></h3><ul><li>Criar: cria uma árvore vazia.</li><li>Inserir: insere um nó na árvore.</li><li>Pesquisar: pesquisa por um nós na árvore.</li><li>Excluir: exclui um nó da árvore.</li><li>Travessia em ordem: faz a travessia da árvore na ordem.</li><li>Travessia pré-ordem: faz a travessia da árvore pré-ordem.</li><li>Travessia pós-ordem: &nbsp;faz a travessia da árvore pós-ordem.</li></ul><h4 id="criar"><strong>Criar</strong></h4><p>Inicialmente, uma árvore vazia e sem nós é criada. A variável/identificador que deve apontar para o nó raiz é inicializado com o valor <code>NULL</code>.</p><h4 id="pesquisar"><strong>Pesquisar</strong></h4><p>Sempre começamos a pesquisa em uma árvore pelo nó raiz e descemos a partir dele. Você compara os dados em cada nó com o valor que você está buscando. Se o nó comparado não corresponder, seguimos para o nó filho da direita ou da esquerda, dependendo do resultado da comparação seguinte: se o nó que buscamos for inferior àquele com o qual estamos comparando, seguimos para o filho da esquerda. Do contrário (se for maior) vamos para o filho da direita. Por quê? Porque a BST é estruturada (por definição) de modo que o filho da direita sempre seja maior que o pai e que o filho da esquerda sempre seja menor.</p><h6 id="busca-em-largura-bfs-do-ingl-s-breadth-first-search-"><strong>Busca em largura (BFS, do inglês <em>breadth-first search</em>)</strong></h6><p>A busca em largura é um algoritmo usado para fazer a travessia de uma BST. Ela começa no nó raiz e viaja de modo lateral (de um lado para outro), buscando pelo nó desejado. Este tipo de busca pode ser descrito como O(n), dado que cada nó é visitado uma vez e que o tamanho da árvore está correlacionado diretamente com o &nbsp;tamanho da busca.</p><h6 id="busca-em-profundidade-dfs-do-ingl-s-depth-first-search-"><strong>Busca em profundidade (DFS, do inglês <em>depth-first search</em>)</strong></h6><p>Com a abordagem da busca em profundidade, começamos com o nó raiz e viajamos para baixo em uma única ramificação. Se o nó desejado for encontrado naquela ramificação, ótimo. Do contrário, continuamos subindo e pesquisando por nós não visitados. Esse tipo de busca também tem uma notação big O de O(n).</p><h4 id="inserir"><strong>Inserir</strong></h4><p>É muito semelhante à função de pesquisar. Novamente, começamos do nó raiz da árvore e descemos de modo recursivo, procurando pelo local certo para inserir o novo nó, do mesmo modo que explicamos na função de pesquisar. Se um nó com o mesmo valor já existir na árvore, é possível escolher inserir a duplicata ou não. Algumas árvores permitem duplicatas, outras não. Isso depende da implementação.</p><h4 id="excluir"><strong>Excluir</strong></h4><p>Há 3 casos que podem acontecer quando você tenta excluir um nós. Ele pode,</p><ol><li>não ter uma subárvore (não ter filhos): esse é o caso mais fácil. Você pode simplesmente excluir o nó, sem precisar realizar outras ações.</li><li>Uma subárvore (um filho): você precisa se certificar de que, após o nó ser excluído, seu filho é, então, conectado ao pai do nó excluído.</li><li>Duas subárvores (dois filhos): você precisa encontrar e substituir o nó que você quer excluir pelo seu sucessor em ordem (o nó mais à esquerda na subárvore à direita).</li></ol><p>A complexidade de tempo para a criação de uma árvore é <code>O(1)</code>. A complexidade de tempo para a pesquisa, inserção ou exclusão de um nó depende da altura <code>h</code> da árvore, portanto o pior caso é <code>O(h)</code> no caso de árvores que vão apenas em uma direção (esquerda ou direita).</p><h4 id="tipos-especiais-de-rvore-bin-ria"><strong>Tipos especiais de árvore binária</strong></h4><ul><li>Heap</li><li>Árvore rubro-negra</li><li>Árvore B (B-Tree)</li><li>Árvore play</li><li>Árvore n-ária</li><li>Trie (árvore de prefixos)</li></ul><h3 id="tempo-de-execu-o"><strong>Tempo de execução</strong></h3><p><strong>Estrutura de dados<strong>: BST</strong> (<em>binary search tree</em>)</strong></p><ul><li>Desempenho no pior caso: &nbsp;<code>O(n)</code></li><li>Desempenho no melhor caso: &nbsp;<code>O(1)</code></li><li>Desempenho médio: &nbsp;<code>O(log n)</code></li><li>Complexidade de espaço no pior caso: &nbsp;<code>O(1)</code></li></ul><p>Onde <code>n</code> &nbsp;é o número de nós da BST. O pior caso é O(n), já que a BST pode não estar balanceada.</p><h3 id="implementa-o-da-bst"><strong>Implementação da BST</strong></h3><p>Aqui temos uma definição para um nó da BST com alguns dados, referenciando seus nós filhos da esquerda e da direita.</p><pre><code>struct node {
   int data;
   struct node *leftChild;
   struct node *rightChild;
};
</code></pre><h4 id="opera-o-de-pesquisa"><strong>Operação de pesquisa</strong></h4><p>Sempre que um elemento precisa ser pesquisado, comece a pesquisa a partir do nó raiz. Depois, se os dados forem menores do que o valor-chave, pesquise o elemento na subárvore da esquerda. Do contrário, pesquise o elemento na subárvore da direita. Siga o mesmo algoritmo para cada nó.</p><pre><code>struct node* search(int data){
   struct node *current = root;
   printf("Elementos visitados: ");
	
   while(current-&gt;data != data){
	
      if(current != NULL) {
         printf("%d ",current-&gt;data);
			
         //vá para a subárvore da esquerda
         if(current-&gt;data &gt; data){
            current = current-&gt;leftChild;
         }//senão, vá para a subárvore da direita
         else {                
            current = current-&gt;rightChild;
         }
			
         //não encontrado
         if(current == NULL){
            return NULL;
         }
      }			
   }
   return current;
}
</code></pre><h4 id="opera-o-de-inser-o"><strong>Operação de inserção</strong></h4><p>Sempre que um elemento precisar ser inserido, primeiro encontre seu local adequado. Comece pesquisando a partir do nó raiz. Então, se os dados forem menores que o valor-chave, pesquise o local vazio na subárvore da esquerda e insira o dado. Do contrário, pesquise o local vazio na subárvore da direita e insira o dado.</p><pre><code>void insert(int data) {
   struct node *tempNode = (struct node*) malloc(sizeof(struct node));
   struct node *current;
   struct node *parent;

   tempNode-&gt;data = data;
   tempNode-&gt;leftChild = NULL;
   tempNode-&gt;rightChild = NULL;

   //se a árvore estiver vazia
   if(root == NULL) {
      root = tempNode;
   } else {
      current = root;
      parent = NULL;

      while(1) {                
         parent = current;
			
         //vá para a esquerda da árvore
         if(data &lt; parent-&gt;data) {
            current = current-&gt;leftChild;                
            //insira à esquerda
				
            if(current == NULL) {
               parent-&gt;leftChild = tempNode;
               return;
            }
         }//vá para a direita da árvore
         else {
            current = current-&gt;rightChild;
            
            //insira à direita
            if(current == NULL) {
               parent-&gt;rightChild = tempNode;
               return;
            }
         }
      }            
   }
}        
</code></pre><h4 id="opera-o-de-exclus-o"><strong>Operação de exclusão</strong></h4><pre><code>void deleteNode(struct node* root, int data){

    if (root == NULL) root=tempnode; 

    if (data &lt; root-&gt;key) 
        root-&gt;left = deleteNode(root-&gt;left, key); 
  

    else if (key &gt; root-&gt;key) 
        root-&gt;right = deleteNode(root-&gt;right, key); 

    else
    { 
        if (root-&gt;left == NULL) 
        { 
            struct node *temp = root-&gt;right; 
            free(root); 
            return temp; 
        } 
        else if (root-&gt;right == NULL) 
        { 
            struct node *temp = root-&gt;left; 
            free(root); 
            return temp; 
        } 
  
        struct node* temp = minValueNode(root-&gt;right); 
 
        root-&gt;key = temp-&gt;key; 

        root-&gt;right = deleteNode(root-&gt;right, temp-&gt;key); 
    } 
    return root; 

}
</code></pre><p>As árvores binárias de busca (BSTs) também nos dão acesso rápido aos predecessores e sucessores. </p><h4 id="predecessor-de-um-n-"><strong>Predecessor de um nó</strong></h4><p>Predecessores podem ser descritos como os nós que vêm logo antes do nó em que você se encontra no momento. Para encontrar o predecessor do nó atual, olhe para o maior nó folha/mais à direita na subárvore esquerda.</p><h4 id="sucessor-de-um-n-"><strong>Sucessor de um nó</strong></h4><p>Sucessores podem ser descritos como os nós que vêm logo após o nó atual. Para encontrar o sucessor do nó atual, olhe para o menor nó folha/mais à esquerda na subárvore da direita.</p><h3 id="vamos-examinar-alguns-procedimentos-de-opera-o-em-rvores"><strong>Vamos examinar alguns procedimentos de operação em árvores</strong></h3><p>Como as árvores são definidas recursivamente, é muito comum escrevermos rotinas que operam nas árvores que sejam recursivas.</p><p>Por exemplo, se quisermos calcular a altura de uma árvore, ou seja, a altura de um nó raiz, podemos fazer isso recursivamente, percorrendo a árvore. Podemos dizer assim:</p><ul><li>Se tivermos uma árvore vazia, sua altura é 0.</li><li>Do contrário, estamos a 1 mais a maior altura entre a da árvore filha à esquerda e a da árvore filha à direita.</li><li>Se olharmos para uma folha, por exemplo, essa altura seria 1, pois a altura do filho à esquerda é 0, e a altura do filho da direita também é 0. Assim, como o máximo dentre os dois é 0, então 1 mais 0 = 1.</li></ul><h4 id="algoritmo-da-altura-height-tree-"><strong>Algoritmo da altura - Height(tree)</strong></h4><pre><code>if tree = nil:
    return 0
return 1 + Max(Height(tree.left),Height(tree.right))
</code></pre><h4 id="este-o-c-digo-em-c-"><strong>Este é o código em C++</strong></h4><pre><code>int maxDepth(struct node* node)
{
    if (node==NULL)
        return 0;
   else
   {
       int rDepth = maxDepth(node-&gt;right);
       int lDepth = maxDepth(node-&gt;left);

       if (lDepth &gt; rDepth)
       {
           return(lDepth+1);
       }
       else
       {
            return(rDepth+1);
       }
   }
}  
</code></pre><p>Também podemos calcular o tamanho de uma árvore, que é o seu número de nós.</p><ul><li>Mais uma vez, se tivermos uma árvore vazia, temos 0 nós.</li><li>Do contrário, temos o número de nós no filho à esquerda mais 1 mais o número de nós no filho à direita. Assim 1 mais o tamanho da árvore da esquerda mais o tamanho da árvore da direita.</li></ul><h4 id="algoritmo-do-tamanho-size-tree-"><strong>Algoritmo do tamanho - Size(tree)</strong></h4><pre><code>if tree = nil
    return 0
return 1 + Size(tree.left) + Size(tree.right)
</code></pre><h4 id="este-o-c-digo-em-c--1"><strong>Este é o código em C++</strong></h4><pre><code>int treeSize(struct node* node)
{
    if (node==NULL)
        return 0;
    else
        return 1+(treeSize(node-&gt;left) + treeSize(node-&gt;right));
}
</code></pre><h4 id="travessias"><strong>Travessias</strong></h4><p>Há 3 tipos de travessias que são feitas tipicamente em uma árvore binária de busca. Todas elas têm um modo bastante comum de percorrer os nós de uma árvore.</p><h3 id="em-ordem-in-order-traversal-">Em ordem (<em>in-order traversal</em>)</h3><p>Essa travessia primeiro percorre a subárvore da esquerda do nó raiz, acessa o nó atual, seguido da subárvore da direita do nó atual. O código abaixo representa o caso de base, também, que diz que uma árvore vazia também é uma árvore binária de busca.</p><pre><code>void inOrder(struct node* root) {
        // Caso de base
        if (root == null) {
                return;
        }
        // Percorre primeiro a subárvore da esquerda.
        inOrder(root.left);
        // Imprime o valor do nó atual.
        printf("%d ", root.data);
        // Percorre em seguida a subárvore da direita.
        inOrder(root.right);
}
</code></pre><h3 id="pr-ordem-pre-order-traversal-"><strong>Pré-ordem (<em>pre-order traversal</em>)</strong></h3><p>Essa travessia primeiro acessa o valor do nó atual, faz a travessia pela subárvore da esquerda e, depois, pela subárvore da direita, respectivamente.</p><pre><code>void preOrder(struct node* root) {
        if (root == null) {
                return;
        }
        // Imprime o valor do nó atual.
        printf("%d ", root.data);
        // Percorre a subárvore da esquerda.
        preOrder(root.left);
        // Percorre a subárvore da direita.
        preOrder(root.right);
}
</code></pre><h3 id="p-s-ordem-post-order-traversal-"><strong>Pós-ordem (<em>post-order traversal</em>)</strong></h3><p>Essa travessia coloca o valor do nó raiz no fim, percorrendo primeiro a subárvore da esquerda e depois a da direita. A ordem relativa das subárvores da esquerda e da direita permanece a mesma. Somente a posição do nó raiz muda em relação às travessias anteriores.</p><pre><code>void postOrder(struct node* root) {
        if (root == null) {
                return;
        }
        // Percorre primeiro a subárvore da esquerda.
        postOrder(root.left);
        // Percorre em seguida a subárvore da direita.
        postOrder(root.right);
        // Imprime o valor do nó atual.
        printf("%d ", root.data);
}
</code></pre><h3 id="v-deos-do-freecodecamp-relevantes-no-canal-do-youtube"><strong>Vídeos do freeCodeCamp relevantes no canal do YouTube </strong></h3><h2 id="binary-search-tree-traversal-and-height-rvore-bin-ria-de-busca-travessia-e-altura-"><strong>Binary Search Tree: Traversal and Height (Árvore binária de busca: travessia e altura)</strong></h2><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/Aagf3RyK3Lw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h3 id="a-seguir-temos-tipos-comuns-de-rvores-bin-rias-"><strong>A seguir, temos tipos comuns de árvores binárias:</strong></h3><p>Árvore totalmente binária/árvore binária estrita: uma árvore é totalmente binária ou estrita se todo nó tiver exatamente 0 ou 2 nós filhos.</p><pre><code>          18
         /   \
       /       \  
     15         30  
    /  \       /  \
  40    50   100   40
</code></pre><p>Na árvore totalmente binária, o número de nós folha é igual ao número de nós internos mais um.</p><p>Árvore binária completa: uma árvore binária é completa se todos os níveis estiverem completamente preenchidos, exceto, possivelmente, o último nível e se o último nível tiver todas as chaves o mais à esquerda possível.</p><pre><code>           18
         /    \
       /        \  
     15         30  
    /  \       /  \
  40    50   100   40
 /  \   /
8    7 9 
</code></pre><p>Árvore binária perfeita: uma árvore binária é perfeita se todos os nós internos tiverem dois nós filhos e se todas as folhas estiverem no mesmo nível.</p><pre><code>          18
         /  \
       /      \  
     15        30  
    /  \      /  \
  40    50  100   40
</code></pre><h3 id="aumentando-uma-bst"><strong>Aumentando uma BST</strong></h3><p>Às vezes, precisamos armazenar algumas informações adicionais com as estruturas de dados tradicionais para tornar nossas tarefas mais fáceis. Por exemplo, considere um cenário onde você deve encontrar o i-ésimo menor número de um conjunto. É possível usar a força bruta aqui, mas queremos reduzir a complexidade do problema para <code>O(lg n)</code> aumentando uma árvore rubro-negra ou qualquer árvore autobalanceada (onde n é o número de elementos do conjunto). Também podemos calcular a classificação de qualquer elemento no tempo <code>O(lg n)</code>. Vamos considerar um caso onde aumentamos uma árvore rubro-negra para que armazene as informações necessárias. Além dos atributos normais, podemos armazenar um certo número de nós internos na subárvore com a raiz x (tamanho da subárvore com raiz em x incluindo o próprio nó). Considere x como sendo qualquer nó arbitrário de uma árvore.</p><p><code>x.size = x.left.size + x.right.size + 1</code></p><p>Quando aumentamos a árvore, levamos em consideração que devemos ser capazes de manter as informações adicionadas, bem como fazer outras operações, como inserção, exclusão e atualização em um tempo <code>O(lg n)</code>.</p><p>Assim, sabemos que o valor de x.left.size (subárvore do lado esquerdo de x) nos dará o número de nós que vêm após x na travessia em ordem da árvore. Portanto, <code>x.left.size + 1</code> é a classificação de x dentro da subárvore com raiz em x.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
