我目前正在尝试编写一种方法,该方法检查两个不同的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;
}
}
此代码有什么问题吗?还是我有什么办法做得更好或更有效?
答案 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)
复杂。
希望获得帮助!