{"id":233232,"date":"2023-02-07T15:18:00","date_gmt":"2023-02-07T12:18:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233232"},"modified":"2023-02-07T15:28:17","modified_gmt":"2023-02-07T12:28:17","slug":"algoritmo-di-ricerca-in-profondita-per-verificare-se-due-alberi-di-espressione-sono-equivalenti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/algoritmo-di-ricerca-in-profondita-per-verificare-se-due-alberi-di-espressione-sono-equivalenti\/","title":{"rendered":"Algoritmo di ricerca in profondit\u00e0 per verificare se due alberi di espressione sono equivalenti"},"content":{"rendered":"\n<blockquote>\n<p>Un albero delle espressioni binarie \u00e8 una specie di albero binario utilizzato per rappresentare le espressioni aritmetiche. Ogni nodo di un albero delle espressioni binario ha zero o due figli. I nodi foglia (nodi con 0 figli) corrispondono agli operandi (variabili) e i nodi interni (nodi con due figli) corrispondono agli operatori. In questo problema, consideriamo solo l&#8217;operatore &#8216;+&#8217; (cio\u00e8 l&#8217;addizione).<\/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 di ricerca in profondit\u00e0 per verificare se due alberi di espressione sono equivalenti\"><\/a><\/p>\n<p>espressione-albero-binario<\/p>\n<p>Vengono fornite le radici di due alberi di espressione binari, root1 e root2. Restituisce true se i due alberi delle espressioni binarie sono equivalenti. In caso contrario, restituisci false.<\/p>\n<p>Due alberi delle espressioni binarie sono equivalenti se valutano lo stesso valore indipendentemente dall&#8217;impostazione delle variabili.<\/p>\n<p>Follow-up: cosa cambierai nella tua soluzione se l&#8217;albero supporta anche l&#8217;operatore &#8216;-&#8216; (es. sottrazione)?<\/p>\n<p>Esempio 1:<br \/>\nInput: root1 = [x], root2 = [x]<br \/>\nOutput: true<\/p>\n<p>Esempio 2:<br \/>\nInput: root1 = [+,a,+,null,null,b,c], root2 = [+,+,b,c,a]<br \/>\nOutput: true<br \/>\nSpiegazione: a + (b + c) == (b + c) + a<\/p>\n<p>Esempio 3:<br \/>\nInput: root1 = [+,a,+,null,null,b,c], root2 = [+,+,b,d,a]<br \/>\nOutput: false<br \/>\nSpiegazione: a + (b + c) != (b + d) + a<\/p>\n<p>Vincoli:<br \/>\nil numero di nodi in entrambi gli alberi \u00e8 uguale, dispari e, nell&#8217;intervallo [1, 4999].<br \/>\nNode.val \u00e8 &#8216;+&#8217; o una lettera inglese minuscola.<br \/>\n\u00c8 garantito che l&#8217;albero fornito sia un albero di espressioni binarie valido.<\/p>\n<p>Suggerimenti:<br \/>\nconta per ogni variabile quante volte \u00e8 apparsa nel primo albero.<br \/>\nFai lo stesso per il secondo albero e controlla se il conteggio \u00e8 lo stesso per entrambi gli alberi.<\/p>\n<\/blockquote>\n<h3>Algoritmo di ricerca in profondit\u00e0 con tabella hash<\/h3>\n<p>Poich\u00e9 l&#8217; albero delle <a href=\"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-dellespressione-regolare-per-sostituire-i-collegamenti-esterni-in-wordpress-per-scopi-seo\/\" title=\"espressioni\">espressioni<\/a> \u00e8 binario e pu\u00f2 contenere solo un simbolo pi\u00f9. Pertanto, possiamo eseguire l&#8217;algoritmo di ricerca in profondit\u00e0 (DFS) su entrambi gli alberi delle espressioni binarie e contare ciascuna variabile. I due alberi delle espressioni sono uguali se entrambi gli alberi contengono lo stesso numero di variabili.<\/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>Il <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> viene eseguito in tempo O(N) dove N \u00e8 il numero dei nodi in entrambi gli alberi delle espressioni binarie. La complessit\u00e0 dello spazio \u00e8 O(N) poich\u00e9 utilizziamo lo stack tramite ricorsione e dobbiamo anche registrare i contatori per ciascuna variabile.<\/p>\n<p>Per confrontare se due mappe hash sono uguali (<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> ), possiamo semplicemente confrontarle in C++ usando il doppio segno di uguale.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <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 di ricerca in profondit\u00e0 per verificare se due alberi di espressione sono equivalenti<\/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":[896,835,751,720,844],"tags":[1168],"class_list":["post-233232","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-guida-per-principianti","category-open-source-projektmanagement-3","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233232"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233232\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224845"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}