Nu cred că aceasta este o întrebare rezonabilă. O soluție simplă recursiva este
boolean equals(x, y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return false;
}
if (x.val != y.val)
{
return false;
}
if (equals(x.left, y.left) && equals(x.right, y.right))
{
return true;
}
if (equals(x.left, y.right) && equals(x.right, y.left))
{
return true;
}
return false;
}
Acest lucru poate fi foarte costisitoare, de exemplu, în cazul în care avem doi copaci mari de formă similară în cazul în care toate nodurile non-frunze au aceeași valoare asociată și nodurile frunze ale unuia sunt o permutare a nodurilor frunze de o alta.
Pentru a obține acest lucru ar putea fi salvat în primul rând o schimbare la stânga și la dreapta după cum este necesar, astfel încât stânga <dreapta, pentru o definiție recursivă a <. Acest lucru ar putea fi, de asemenea, scump, dar mult mai puțin decât verificarea fiecare permutare, și cred că o alegere de definiție a <ar ajuta. Acest lucru ar permite apoi să verificați pentru egalitatea cu o definiție obișnuită.
Această noțiune de http://en.wikipedia.org/wiki/Canonicalization urmată de egalitate ordinară rezolvă , de asemenea , întrebări cu privire dacă într-adevăr aveți o relație de echivalență. O relație de echivalență este echivalentă cu o partiție. Egalitate ordinară este , evident , o partiție. Dacă compara x și y prin compararea f (x) și f (y) , urmată de o relație de echivalență aveți o partiție de x și y, și , prin urmare , o relație de echivalență.
Gândire mai multe despre acest lucru, cred că modul de a face fie canonicalisation sau egalitatea de testare în mod rezonabil eficiente este de a lucra de jos în sus, adnotarea fiecare nod cu un simbol a cărui valoare reflectă rezultatul comparații cu alte noduri, astfel încât să puteți compara noduri , iar subramificații sub ele, fie doar compararea token-uri.
Deci, primul pas pentru egalitate este de a utiliza de exemplu un tabel hash pentru a adnota fiecare frunză cu jetoanele care sunt egale numai atunci când valorile la frunzele sunt egale. Apoi, pentru noduri ale căror copii sunt numai frunze, de exemplu, utilizați un tabel hash pentru a atribui token-uri suplimentare, astfel încât semnele în aceste noduri sunt egale numai atunci când frunzele, dacă este cazul, sub aceste noduri meci. Apoi, puteți merge un pas mai mult în sus, și de data aceasta, puteți compara token-uri la nodurile copil în loc de recursiune copacul acolo. Costul de a atribui token-uri în acest fel ar trebui să fie liniar în dimensiunea arborilor implicate. In partea de sus poti compara copaci doar prin compararea jetoanele de la rădăcină.