Я запускаю код, чтобы проверить, изоморфны ли два дерева. Они изоморфны, если одно можно перестроить так, чтобы оно имитировало другое. Поменять местами могут только дочерние узлы, нельзя поменять местами родительский узел с дочерним узлом, или наоборот, или любым другим способом. И нулевые деревья изоморфны.
У меня есть небольшой рекурсивный код, который сначала обрабатывает ошибки нулевого указателя. Затем я проверяю, имеют ли узлы один и тот же int, и если они есть, я вызываю рекурсивно каждую комбинацию их дочерних узлов. Единственный раз, когда он возвращает ложь, кроме как в нулевых случаях, это когда одна из этих комбинаций не равна. Или, по крайней мере, это то, что я пытаюсь достичь.
Вот что у меня есть. (Примечание: я использую исключение нулевого указателя, потому что мне нужно работать с объектом узла).
class GfG
{
public boolean isIsomorphic(Node root1,Node root2)
{
boolean a, b;
a = b = false;
int i;
try{
i = root1.data;
}
catch(NullPointerException ex){
a = true;
}
try{
i = root2.data;
}
catch(NullPointerException ex){
b = true;
}
if(a == true & b == true){
return true;
}
else if((a == false & b == true) | (b ==false & a ==true)){
return false;
}
else {
if(root1.data == root2.data){
isIsomorphic(root1.left, root2.left);
isIsomorphic(root1.right, root2.right);
isIsomorphic(root1.left, root2.right);
isIsomorphic(root1.right, root2.left);
return true;
}
else{
return false;
}
}
}
}
объект Node имеет и int как атрибут, которому он передан и инициализирован, и два дочерних узла, инициализированные нулем.
(Существует такой случай, когда они могут быть инициализированы нулем, следовательно, исключение null).
Я должен вернуть false в этом случае, но вернуть true, хотя понятия не имею, почему
0 1 L 0 2 R 1 3 L 1 4 R 2 5 L 2 6 R 3 7 L 3 8 R 4 9 L 4 10 R 5 11 L 5 12 R 6 13 L 6 14 R
0 3 L 0 0 R 3 6 L 3 14 R 0 4 L 0 11 R 6 8 L 6 9 R 14 1 L 14 14 R 4 10 L 4 13 R 11 14 L 11 1 R