{"id":97,"date":"2015-04-08T19:35:14","date_gmt":"2015-04-08T22:35:14","guid":{"rendered":"http:\/\/just.pro.br\/blog\/?p=97"},"modified":"2015-04-08T19:35:14","modified_gmt":"2015-04-08T22:35:14","slug":"codigo-de-arvore-binaria","status":"publish","type":"post","link":"https:\/\/just.pro.br\/blog\/2015\/04\/08\/codigo-de-arvore-binaria\/","title":{"rendered":"C\u00f3digo de \u00e1rvore bin\u00e1ria"},"content":{"rendered":"<p>Ol\u00e1, pessoal.<\/p>\n<p>Como prometido, aqui est\u00e1 o c\u00f3digo da \u00e1rvore bin\u00e1ria de busca. Lembrem-se: implementem o balanceamento (\u00c1rvore AVL) e entreguem at\u00e9 o dia 21\/04\/15 via e-mail.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n\r\n\/* Estrutura de um n\u00f3 *\/\r\nstruct no\r\n{\r\n    int chave;\r\n    struct no *p;\r\n    struct no *e;\r\n    struct no *d;\r\n};\r\n\r\n\/* Calcula a altura de uma \u00e1rvore *\/\r\nint altura(struct no *raiz)\r\n{\r\n    if(raiz == NULL)\r\n        return 0;\r\n\r\n    int e = altura(raiz-&gt;e);\r\n    int d = altura(raiz-&gt;d);\r\n    int m;\r\n\r\n    if (e &gt; d)\r\n        m = e;\r\n    else\r\n        m = d;\r\n\r\n    return m + 1;\r\n}\r\n\r\n\/* Calcula o fator de balanceamento de um n\u00f3 *\/\r\nint balanceamento(struct no *raiz)\r\n{\r\n    return altura(raiz-&gt;d) - altura(raiz-&gt;e);\r\n}\r\n\r\n\/* Cria um n\u00f3 *\/\r\nstruct no *criar(int chave)\r\n{\r\n    struct no *novo = malloc(sizeof(struct no));\r\n    novo-&gt;chave = chave;\r\n    novo-&gt;p = novo-&gt;e = novo-&gt;d = NULL;\r\n}\r\n\r\n\/* Busca um n\u00f3 na \u00e1rvore *\/\r\nstruct no *buscar(struct no *raiz, int chave)\r\n{\r\n    if(raiz == NULL)\r\n        return NULL;\r\n    if(raiz-&gt;chave == chave)\r\n        return raiz;\r\n\r\n    if(chave &gt; raiz-&gt;chave)\r\n        return buscar(raiz-&gt;d,chave);\r\n    else\r\n        return buscar(raiz-&gt;e,chave);\r\n}\r\n\r\n\/* Adiciona elemento na \u00e1rvore *\/\r\nstruct no *adicionar(struct no *raiz, int chave)\r\n{\r\n    if (raiz == NULL)\r\n    {\r\n        struct no *novo = criar(chave);\r\n        return novo;\r\n    }\r\n\r\n    if (chave &lt; raiz-&gt;chave)\r\n    {\r\n        struct no *novo = adicionar(raiz-&gt;e, chave);\r\n        raiz-&gt;e = novo;\r\n        novo-&gt;p = raiz;\r\n    }\r\n    else\r\n    {\r\n        struct no *novo = adicionar(raiz-&gt;d, chave);\r\n        raiz-&gt;d = novo;\r\n        novo-&gt;p = raiz;\r\n    }\r\n\r\n    return raiz;\r\n}\r\n\r\n\/* Imprime a \u00e1rvore em ordem *\/\r\nvoid emordem(struct no *raiz)\r\n{\r\n    if (raiz == NULL)\r\n        return;\r\n\r\n    emordem(raiz-&gt;e);\r\n    printf(&quot;%d &quot;,raiz-&gt;chave);\r\n    emordem(raiz-&gt;d);\r\n}\r\n\r\n\/* Imprime a \u00e1rvore em pr\u00e9-ordem *\/\r\nvoid preordem(struct no *raiz)\r\n{\r\n    if (raiz == NULL)\r\n        return;\r\n\r\n    printf(&quot;%d &quot;,raiz-&gt;chave);\r\n    preordem(raiz-&gt;e);\r\n    preordem(raiz-&gt;d);\r\n}\r\n\r\n\/* Imprime a \u00e1rvore em p\u00f3s-ordem *\/\r\nvoid posordem(struct no *raiz)\r\n{\r\n    if (raiz == NULL)\r\n        return;\r\n\r\n    posordem(raiz-&gt;e);\r\n    posordem(raiz-&gt;d);\r\n    printf(&quot;%d &quot;,raiz-&gt;chave);\r\n}\r\n\r\n\/* Retorna o m\u00ednimo de uma \u00e1rvore *\/\r\nstruct no *minimo(struct no *raiz)\r\n{\r\n    if (raiz == NULL)\r\n        return;\r\n\r\n    if (raiz-&gt;e == NULL)\r\n        return raiz;\r\n\r\n    return minimo(raiz-&gt;e);\r\n}\r\n\r\n\/* Retorna o m\u00e1ximo de uma \u00e1rvore *\/\r\nstruct no *maximo(struct no *raiz)\r\n{\r\n    if (raiz == NULL)\r\n        return;\r\n\r\n    if (raiz-&gt;d == NULL)\r\n        return raiz;\r\n\r\n    return maximo(raiz-&gt;d);\r\n}\r\n\r\n\/* Retorna o antecessor de um n\u00f3 *\/\r\nstruct no *antecessor(struct no *raiz)\r\n{\r\n    if(raiz-&gt;e == NULL)\r\n    {\r\n        while(raiz-&gt;p != NULL &amp;&amp; raiz-&gt;p-&gt;chave &gt; raiz-&gt;chave  )\r\n            raiz = raiz-&gt;p;\r\n\r\n        return raiz-&gt;p;\r\n    }\r\n    return maximo(raiz-&gt;e);\r\n}\r\n\r\n\/* Retorna o sucessor de um n\u00f3 *\/\r\nstruct no *sucessor(struct no *raiz)\r\n{\r\n    if(raiz-&gt;d == NULL)\r\n    {\r\n        while(raiz-&gt;p != NULL &amp;&amp; raiz-&gt;p-&gt;chave &lt; raiz-&gt;chave  )\r\n            raiz = raiz-&gt;p;\r\n        return raiz-&gt;p;\r\n    }\r\n\r\n    return minimo(raiz-&gt;d);\r\n\r\n}\r\n\r\n\/* Remove um n\u00f3 da \u00e1rvore e retorna a nova \u00e1rvore *\/\r\nstruct no* remover(struct no *arvore, int chave)\r\n{\r\n    if(arvore == NULL)\r\n        return NULL;\r\n\r\n    struct no *raiz = buscar(arvore, chave);\r\n\r\n    if (raiz == NULL)\r\n        return arvore;\r\n\r\n    \/\/ Remover NO sem Filhos\r\n    if (raiz-&gt;e == NULL &amp;&amp; raiz-&gt;d == NULL)\r\n    {\r\n        if(raiz-&gt;p != NULL)\r\n        {\r\n            if(raiz-&gt;p-&gt;chave &gt;= raiz-&gt;chave)\r\n                raiz-&gt;p-&gt;e = NULL;\r\n            else\r\n                raiz-&gt;p-&gt;d = NULL;\r\n            free(raiz);\r\n        }\r\n        else\r\n        {\r\n            free(raiz);\r\n            return NULL;\r\n        }\r\n        if (raiz == arvore)\r\n            return NULL;\r\n    }\r\n    else\r\n    {\r\n        \/\/ Remover NO com 2 Filhos\r\n        if (raiz-&gt;e &amp;&amp; raiz-&gt;d != NULL)\r\n        {\r\n            struct no *ant = antecessor(raiz);\r\n            raiz-&gt;chave = ant-&gt;chave;\r\n            ant = remover(ant, ant-&gt;chave);\r\n        }\r\n        \/\/ Remover NO com 1 Filho\r\n        else\r\n        {\r\n            \/\/Reconectar Filho a Esquerda\r\n            if(raiz-&gt;e != NULL)\r\n            {\r\n                if (raiz-&gt;p != NULL)\r\n                {\r\n                    if(raiz-&gt;p-&gt;chave &gt; raiz-&gt;chave)\/\/Caso o pai seja maior\r\n                        raiz-&gt;p-&gt;e = raiz-&gt;e;\r\n                    else\/\/Caso o pai seja menor\r\n                        raiz-&gt;p-&gt;d = raiz-&gt;e;\r\n                }\r\n                raiz-&gt;e-&gt;p = raiz-&gt;p;\r\n            }\r\n            \/\/Reconectar Filho a Direita\r\n            else\r\n            {\r\n                if (raiz-&gt;p != NULL)\r\n                {\r\n                    if(raiz-&gt;p-&gt;chave &lt; raiz-&gt;chave)\/\/Caso o pai seja menor\r\n                        raiz-&gt;p-&gt;d = raiz-&gt;d;\r\n                    else\/\/Caso o pai seja maior\r\n                        raiz-&gt;p-&gt;e = raiz-&gt;d;\r\n                }\r\n                raiz-&gt;d-&gt;p = raiz-&gt;p;\r\n\r\n                free(raiz);\r\n            }\r\n        }\r\n    }\r\n\r\n    return arvore;\r\n}\r\n\r\n\/* Fun\u00e7\u00e3o principal *\/\r\nint main(void)\r\n{\r\n    struct no *arvore = NULL;\r\n    int opt, chave;\r\n\r\n    do\r\n    {\r\n        printf(&quot;Escolha uma opcao:\\n\\n&quot;);\r\n        printf(&quot;1 - Adicionar\\n&quot;);\r\n        printf(&quot;2 - Listar\\n&quot;);\r\n        printf(&quot;3 - Remover\\n&quot;);\r\n        printf(&quot;0 - Sair\\n&quot;);\r\n        scanf(&quot;%d&quot;, &amp;opt);\r\n\r\n        switch(opt)\r\n        {\r\n        case 1:\r\n            printf(&quot;\\n\\nDigite uma chave: &quot;);\r\n            scanf(&quot;%d&quot;, &amp;chave);\r\n            arvore = adicionar(arvore, chave);\r\n            break;\r\n\r\n        case 2:\r\n            printf(&quot;\\n\\n&quot;);\r\n            printf(&quot;Em ordem: \\n&quot;);\r\n            emordem(arvore);\r\n            printf(&quot;\\n\\n&quot;);\r\n            printf(&quot;Pre ordem: \\n&quot;);\r\n            preordem(arvore);\r\n            printf(&quot;\\n\\n&quot;);\r\n            printf(&quot;Pos ordem: \\n&quot;);\r\n            posordem(arvore);\r\n            printf(&quot;\\n\\n&quot;);\r\n            break;\r\n\r\n        case 3:\r\n            printf(&quot;\\n\\nDigite a chave a ser removida: &quot;);\r\n            scanf(&quot;%d&quot;, &amp;chave);\r\n            arvore = remover(arvore, chave);\r\n            break;\r\n\r\n        case 0:\r\n            return 0;\r\n\r\n        default:\r\n            printf(&quot;Opcao invalida!\\n\\n&quot;);\r\n        }\r\n    }\r\n    while(1);\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, pessoal. Como prometido, aqui est\u00e1 o c\u00f3digo da \u00e1rvore bin\u00e1ria de busca. Lembrem-se: implementem o balanceamento (\u00c1rvore AVL) e entreguem at\u00e9 o dia 21\/04\/15 via e-mail. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; \/* Estrutura de um n\u00f3 *\/ struct no { &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/just.pro.br\/blog\/2015\/04\/08\/codigo-de-arvore-binaria\/\"> <span class=\"screen-reader-text\">C\u00f3digo de \u00e1rvore bin\u00e1ria<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,2],"tags":[],"class_list":["post-97","post","type-post","status-publish","format-standard","hentry","category-estrutura-de-dados-2","category-unifacs"],"_links":{"self":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/97","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/comments?post=97"}],"version-history":[{"count":1,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/97\/revisions"}],"predecessor-version":[{"id":98,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/posts\/97\/revisions\/98"}],"wp:attachment":[{"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/media?parent=97"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/categories?post=97"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/just.pro.br\/blog\/wp-json\/wp\/v2\/tags?post=97"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}