восстановить алгоритм изоморфизма деревьев? - PullRequest
0 голосов
/ 25 марта 2019

Я запускаю код, чтобы проверить, изоморфны ли два дерева. Они изоморфны, если одно можно перестроить так, чтобы оно имитировало другое. Поменять местами могут только дочерние узлы, нельзя поменять местами родительский узел с дочерним узлом, или наоборот, или любым другим способом. И нулевые деревья изоморфны.

У меня есть небольшой рекурсивный код, который сначала обрабатывает ошибки нулевого указателя. Затем я проверяю, имеют ли узлы один и тот же 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...