{"id":233196,"date":"2023-02-07T15:09:00","date_gmt":"2023-02-07T12:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233196"},"modified":"2023-02-07T15:13:14","modified_gmt":"2023-02-07T12:13:14","slug":"algoritmo-de-pesquisa-em-profundidade-para-verificar-se-duas-arvores-de-expressao-sao-equivalentes","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/algoritmo-de-pesquisa-em-profundidade-para-verificar-se-duas-arvores-de-expressao-sao-equivalentes\/","title":{"rendered":"Algoritmo de pesquisa em profundidade para verificar se duas \u00e1rvores de express\u00e3o s\u00e3o equivalentes"},"content":{"rendered":"\n<blockquote>\n<p>Uma \u00e1rvore de express\u00e3o bin\u00e1ria \u00e9 um tipo de \u00e1rvore bin\u00e1ria usada para representar express\u00f5es aritm\u00e9ticas. Cada n\u00f3 de uma \u00e1rvore de express\u00e3o bin\u00e1ria tem zero ou dois filhos. Os n\u00f3s folha (n\u00f3s com 0 filhos) correspondem aos operandos (vari\u00e1veis), e os n\u00f3s internos (n\u00f3s com dois filhos) correspondem aos operadores. Neste problema, consideramos apenas o operador &#8216;+&#8217; (ou seja, adi\u00e7\u00e3o).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-154541-61e5418318d57.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-154541-61e5418318d57.jpg\" alt=\"Algoritmo de pesquisa em profundidade para verificar se duas \u00e1rvores de express\u00e3o s\u00e3o equivalentes\"><\/a><\/p>\n<p>express\u00e3o-\u00e1rvore-bin\u00e1ria<\/p>\n<p>Voc\u00ea recebe as ra\u00edzes de duas \u00e1rvores de express\u00e3o bin\u00e1ria, root1 e root2. Retorna true se as duas \u00e1rvores de express\u00e3o bin\u00e1ria forem equivalentes. Caso contr\u00e1rio, retorne falso.<\/p>\n<p>Duas \u00e1rvores de express\u00e3o bin\u00e1ria s\u00e3o equivalentes se forem avaliadas com o mesmo valor, independentemente de como as vari\u00e1veis \u200b\u200best\u00e3o definidas.<\/p>\n<p>Acompanhamento: O que voc\u00ea mudar\u00e1 em sua solu\u00e7\u00e3o se a \u00e1rvore tamb\u00e9m suportar o operador &#8216;-&#8216; (ou seja, subtra\u00e7\u00e3o)?<\/p>\n<p>Exemplo 1:<br \/>\nEntrada: root1 = [x], root2 = [x]<br \/>\nSa\u00edda: true<\/p>\n<p>Exemplo 2:<br \/>\nEntrada: root1 = [+,a,+,null,null,b,c], root2 = [+,+,b,c,a]<br \/>\nSa\u00edda: true<br \/>\nExplica\u00e7\u00e3o: a + (b + c) == (b + c) + a<\/p>\n<p>Exemplo 3:<br \/>\nEntrada: root1 = [+,a,+,null,null,b,c], root2 = [+,+,b,d,a]<br \/>\nSa\u00edda: false<br \/>\nExplica\u00e7\u00e3o: a + (b + c) != (b + d) + a<\/p>\n<p>Restri\u00e7\u00f5es:<br \/>\nO n\u00famero de n\u00f3s em ambas as \u00e1rvores \u00e9 igual, \u00edmpar e, no intervalo [1, 4999].<br \/>\nNode.val \u00e9 &#8216;+&#8217; ou uma letra min\u00fascula em ingl\u00eas.<br \/>\n\u00c9 garantido que a \u00e1rvore fornecida \u00e9 uma \u00e1rvore de express\u00e3o bin\u00e1ria v\u00e1lida.<\/p>\n<p>Dicas:<br \/>\nConte para cada vari\u00e1vel quantas vezes ela apareceu na primeira \u00e1rvore.<br \/>\nFa\u00e7a o mesmo para a segunda \u00e1rvore e verifique se a contagem \u00e9 a mesma para ambas as \u00e1rvores.<\/p>\n<\/blockquote>\n<h3>Algoritmo de primeira pesquisa de profundidade com tabela de hash<\/h3>\n<p>Como a \u00e1rvore de <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-a-expressao-regular-para-substituir-links-externos-no-wordpress-para-fins-de-seo\/\" title=\"express\u00e3o\">express\u00e3o<\/a> \u00e9 bin\u00e1ria e pode conter apenas um s\u00edmbolo de mais. Portanto, podemos executar o algoritmo Depth First Search (DFS) em ambas as \u00e1rvores de express\u00e3o bin\u00e1ria e contar cada vari\u00e1vel. As duas \u00e1rvores de express\u00e3o s\u00e3o iguais se ambas as \u00e1rvores contiverem o mesmo n\u00famero de vari\u00e1veis.<\/p>\n<pre><code>\/**\n\u00a0* Definition for a binary tree node.\n\u00a0* struct Node {\n\u00a0* \u00a0 \u00a0 char val;\n\u00a0* \u00a0 \u00a0 Node *left;\n\u00a0* \u00a0 \u00a0 Node *right;\n\u00a0* \u00a0 \u00a0 Node(): val(' '), left(nullptr), right(nullptr) {}\n\u00a0* \u00a0 \u00a0 Node(char x): val(x), left(nullptr), right(nullptr) {}\n\u00a0* \u00a0 \u00a0 Node(char x, Node *left, Node *right): val(x), left(left), right(right) {}\n\u00a0* };\n\u00a0*\/\nclass Solution {\npublic:\n\u00a0 \u00a0 bool checkEquivalence(Node* root1, Node* root2) {\n\u00a0 \u00a0 \u00a0 \u00a0 if (root1 == root2) return true;\n\u00a0 \u00a0 \u00a0 \u00a0 unordered_map&lt;char, int&gt; count1, count2;\n\u00a0 \u00a0 \u00a0 \u00a0 dfs(root1, count1);\n\u00a0 \u00a0 \u00a0 \u00a0 dfs(root2, count2);\n\u00a0 \u00a0 \u00a0 \u00a0 return count1 == count2;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \nprivate: \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 void dfs(Node* root, unordered_map&lt;char, int&gt; &amp;count) {\n\u00a0 \u00a0 \u00a0 \u00a0 if (!root) return ;\n\u00a0 \u00a0 \u00a0 \u00a0 if (root-&gt;val != '+') count[root-&gt;val] ++;\n\u00a0 \u00a0 \u00a0 \u00a0 dfs(root-&gt;left, count);\n\u00a0 \u00a0 \u00a0 \u00a0 dfs(root-&gt;right, count);\n\u00a0 \u00a0 }\n};<\/code><\/pre>\n<p>O <a href=\"https:\/\/helloacm.com\/how-to-find-the-vertical-order-traversal-of-a-binary-tree-using-dfs-algorithm\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">DFS<\/a> \u00e9 executado em tempo O(N), onde N \u00e9 o n\u00famero de n\u00f3s em ambas as \u00e1rvores de express\u00e3o bin\u00e1ria. A complexidade do espa\u00e7o \u00e9 O(N), pois estamos usando pilha via recurs\u00e3o e tamb\u00e9m precisamos registrar os contadores para cada vari\u00e1vel.<\/p>\n<p>Para comparar se dois mapas de hash s\u00e3o iguais (<a href=\"https:\/\/helloacm.com\/recursive-depth-first-search-algorithm-to-compute-the-diameter-of-binary-tree\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">unordered_map<\/a> ), podemos simplesmente compar\u00e1-los em C++ usando o sinal de igual duplo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Algoritmo de pesquisa em profundidade para verificar se duas \u00e1rvores de express\u00e3o s\u00e3o equivalentes<\/p>\n","protected":false},"author":1,"featured_media":224845,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,837,846],"tags":[1170],"class_list":["post-233196","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-guia-para-iniciantes","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233196"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233196\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224845"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}