首页 > 解决方案 > 用于解决树同构的递归算法?

问题描述

我正在运行代码来检查两棵树是否同构。如果一个可以重新排列以模仿另一个,它们是同构的。只能交换子节点,不能将父节点与子节点交换,反之亦然或以任何其他方式。而且,空树是同构的。

我有一个小的递归代码,它首先处理空指针错误。然后我检查节点是否具有相同的 int,如果它们有,我会递归地调用它们的子节点的每个组合。除了在 null 情况下,它返回 false 的唯一时间是当这些组合之一不相等时。或者至少这就是我想要完成的。

这就是我所拥有的。(注意:我使用空指针异常,因为我必须使用节点对象)。

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。(有这样一种情况,它们可以被初始化为 null,因此是 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

标签: javaclassrecursionnullpointerexception

解决方案


推荐阅读