For BST:
- Vegyük az első elemeit egyaránt tömbök és a mérkőzés. Ha nem egyezik, akkor BST nem lehet azonos.
- Keresse meg az első balra gyerekek , hogy nem ellenőrizte (a pozíciókban leftPos1 és leftPos2) és a mérkőzés. Ha nem egyezik, akkor BST nem ugyanaz.
- Keresse meg az első jobbra gyerekek , hogy nem ellenőrizte (a pozíciókban rightPos1 és rightPos2) és a mérkőzés. Ha nem egyezik, akkor BST nem ugyanaz.
- Ha mind a bal és a jobb oldali gyermek egyeznek, a ugyanazok a műveletek rekurzívan a két párt sublists / részfa (az leftPos1 és leftPos2) és (az rightPos1 és rightPos2). A szülő Ezeknek részfájának az első eleme a tömb.
Miközben keresi a bal és a jobb gyerekek a allista, lehet, hogy az elemeket, amelyeket már beszkennelt. Ahhoz, hogy megtudja, az ilyen elemeket, ellenőrizze, hogy eleme, hogy lehet a gyerekek a jelenlegi részfa. Ha az aktuális részfa van bal oldalon a szülő, majd hasonlítsa össze az elemet a szülő, ha tartozik a jobb oldali majd figyelmen kívül hagyni ezt az elemet.
#include <stdio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
BOOL isLeft(int parent, int child) {
return child <= parent;
}
BOOL isRight(int parent, int child) {
return child > parent;
}
BOOL isBelongToChild(int parent, int child, int value) {
if (isLeft(parent, child) && (isLeft(parent, value))) {
return TRUE;
}
if (isRight(parent, child) && (isRight(parent, value))) {
return TRUE;
}
return FALSE;
}
int getLeftPosition(int * array, int size, int parent, BOOL parentExists) {
int i;
int first = *array;
for (i = 1; i < size; i++) {
int value = *(array + i);
if (! isBelongToChild(parent, first, value)) {
continue;
}
if (isLeft(first, value)) {
return i;
}
}
return -1;
}
int getRightPosition(int * array, int size, int parent, BOOL parentExists) {
int i;
int first = *array;
for (i = 1; i < size; i++) {
int value = *(array + i);
if (! isBelongToChild(parent, first, value)) {
continue;
}
if (isRight(first, value)) {
return i;
}
}
return -1;
}
BOOL areSame(int * array1, int pos1, int * array2, int pos2) {
if (pos1 == -1 && pos2 == -1) {
return TRUE;
} else if (*(array1 + pos1) == *(array2 + pos2)) {
return TRUE;
} else {
return FALSE;
}
}
BOOL isSameBst(int * array1, int size1, int * array2, int size2, int parent, BOOL parentExists) {
if (0 == size1 && 0 == size2) {
return TRUE;
}
if (*array1 != *array2) {
return FALSE;
}
int leftPos1 = getLeftPosition(array1, size1, parent, parentExists);
int leftPos2 = getLeftPosition(array2, size2, parent, parentExists);
if (! areSame(array1, leftPos1, array2, leftPos2)) {
return FALSE;
}
int rightPos1 = getRightPosition(array1, size1, parent, parentExists);
int rightPos2 = getRightPosition(array2, size2, parent, parentExists);
if (! areSame(array1, rightPos1, array2, rightPos2)) {
return FALSE;
}
if (leftPos1 > -1) {
int result = isSameBst((array1 + leftPos1), size1 - leftPos1, (array2 + leftPos2), size2 - leftPos2, *array1, TRUE);
if (FALSE == result) {
return FALSE;
}
}
if (rightPos1 > -1) {
int result = isSameBst((array1 + rightPos1), size1 - rightPos1, (array2 + rightPos2), size2 - rightPos2, *array1, TRUE);
if (FALSE == result) {
return FALSE;
}
}
return TRUE;
}
int main ()
{
int a[] = { 5, 6, 2, 7, 4 };
int b[] = { 5, 6, 7, 2, 4 };
printf ("%s\n", (isSameBst(a, 5, b, 5, 0, FALSE) ? "yes" : "no"));
return 0;
}