在两个不同的BinarySearchTrees

时间:2018-10-24 00:19:14

标签: java recursion tree binary-search-tree nodes

我目前正在尝试编写一种方法,该方法检查两个不同的Binary Search树中的所有节点,并找到两个树之间具有公共密钥的节点。 (即,尝试从树1中找到一个节点,并从树2中找到一个包含相同键的节点。如果找到一个公共节点,则该方法返回true,否则返回false。第二棵树存储在与tree不同的对象中1,称为GraphicalObject。键采用坐标形式,大小比较是按列顺序进行的。

我编写了以下代码,但想知道它是否有问题或我可以改进的地方?

1)一种使用递归调用检查树1中的节点是否与树2中的每个节点相同的方法。 compareTo方法在其他位置定义。

public boolean findPixel(BinaryNode node1, BinaryNode node2, GraphicalObject gobj) {
    //Creating the final coordinate key by altering the original key in nodes of tree 2.
    int xCor = node2.getData().getLocation().xCoord() + gobj.getOffset().xCoord() - graphicPos.xCoord();
    int yCor = node2.getData().getLocation().yCoord() + gobj.getOffset().yCoord() - graphicPos.yCoord();
    Location newLoc = new Location(xCor, yCor); //Creates the final key to be checked up on
    if(node1.getData().getLocation().compareTo(newLoc) == 0) { //If keys are the same
        return true;
    } else {
        if(node1.getData().getLocation().compareTo(newLoc) == -1) { //if key from node 1 is smaller than key from node 2.
            node2 = node2.getLeft();
            findPixel(node1, node2, gobj);
        } else {
            node2 = node2.getRight();
            findPixel(node1, node2, gobj);
        }
    }
    return false; 
}

2)一种使用findPixel方法检查树1中的每个节点并将它们与树2中的每个节点进行有序遍历的方法。

private boolean findCommonNode(BinaryNode node1, BinaryNode node2, GraphicalObject gobj) {
    if(node1 != null) {
        findCommonNode(node1.getLeft(), node2, gobj);
        return findPixel(node1, node2, gobj);
        findCommonNode(node1.getRight(), node2, gobj);
    }
}

3)方法,如果找到两棵树之间的公共节点,则返回true,否则返回false。

public boolean intersects(GraphicalObject gobj){
    BinaryNode tempNode = newTree.getRoot();
    BinaryNode tempNode2 = gobj.getTree().getRoot();
    if (findCommonNode(tempNode, tempNode2, gobj) == true) {
        return true;
    } else {
        return false;
    }
}

此代码有什么问题吗?还是我有什么办法做得更好或更有效?

1 个答案:

答案 0 :(得分:1)

您的代码中有几处地方似乎是错误的:

在第一种方法中,您调用findPixel的递归调用-您需要返回该方法的答案。应该是这样的:

} else {
    if(node1.getData().getLocation().compareTo(newLoc) == -1) 
        return findPixel(node1, node2.getLeft(), gobj);
    else
        return findPixel(node1, node2.getRight(), gobj);
}
return false; 

在提取位置之前,还应该为null添加node2的支票。将此添加到findPixel函数的第一行:

if (node2 == null)
    return false;

在第二种方法上,您在函数内使用return语句->因此,您将不会进行顺序遍历,但会忽略树的右侧。该代码需要如下:

if(node1 != null) {
    return (findCommonNode(node1.getLeft(), node2, gobj)) ||  (findPixel(node1, node2, gobj)) || (findCommonNode(node1.getRight(), node2, gobj));
}

这样,您可以节省一些运行时间(如果答案是正确的,则无需继续寻找更多类似的节点)。

可以将第三种方法修改为(可读性):

BinaryNode tempNode = newTree.getRoot();
BinaryNode tempNode2 = gobj.getTree().getRoot();
return (findCommonNode(tempNode, tempNode2, gobj));

这是给定代码的

但是,更优化的解决方案将是遍历一棵树,然后在哈希图中插入值(在哈希之后)-然后遍历第二棵树并针对每个节点:检查哈希树中是否存在该值。与您的解决方案O(n)相比,这将O(n^2)复杂。

希望获得帮助!