以下是我目前添加新节点的代码(在同一级别上)。这是在添加newNode时需要修改以添加排序属性的代码部分。通俗地说,当newNode之前的String数据大于newNode本身的String数据时,我需要在该位置添加newNode。
public void traverseRight(Node v, Node newNode) {
if(v.getData().equals(newNode.getData())){
System.out.println(v.getData() + " was already found in the tree under " + v.getParent().getData() + ".");
}
else if (hasRight(v)) {
traverseRight(v.getRight(), newNode);
}
else {
v.setRight(newNode);
newNode.setParent(v.getParent());
}
}
如果还有其他任何有用的东西,比如更多代码,我还有很多可以解决的问题。
更新:好的,经过一小时的节奏和一次YouTube搜索“java compareTo()”之后,这就是我想出来的。我试图添加一些简明的注释,以提高可读性。
对此方法有何看法?我是否忽视了任何事情或做错了什么/做得不好?
public void traverseRight(Node v, Node newNode) {
if(v.getData().equals(newNode.getData())){
System.out.println(v.getData() + " was already found in the tree under " + v.getParent().getData() + ".");
}
else if(v.getData().compareToIgnoreCase(newNode.getData()) > 0){
if(v.getParent().getLeft() == v){
// MEANS V IS THE FIRST CHILD IN THIS STRUCTURE
newNode.setParent(v.getParent());
v.getParent().setLeft(newNode);
newNode.setRight(v);
}
else{
// V IS NOT THE FIRST CHILD, GUARANTEED TO HAVE A PREVIOUS NODE
Node prev = getPrev(v.getParent().getLeft(), v);
newNode.setParent(v.getParent());
prev.setRight(newNode);
newNode.setRight(v);
}
}
else if (hasRight(v)) {
traverseRight(v.getRight(), newNode);
}
else {
// MEANS WE REACHED THE END OF THE STRUCTURE W/O A HIGHER VALUE THAN NEWNODE
v.setRight(newNode);
newNode.setParent(v.getParent());
}
}
对于记录,它通过了我到目前为止运行的所有调试测试..这并不多,因为它只工作了大约10分钟,但到目前为止一直很好。
再次感谢!
UPDATE#2:在订购结尾有多个数字的字符串时失败。 (例如22号航班)
如果我要输入航班1,2,3和22,我的程序会返回:
航班1 2号航班 22号航班 3号航班
不是世界末日,因为它只是一个家庭作业项目,但我不确定是否有人对此有任何快速修复。谢谢!
答案 0 :(得分:0)
您可以做的是让您的节点实现Comparable
。在compareTo
方法中,您可以决定哪些字段用于比较(更大,更小或等于)。
public class Node implements Comparable<Node> {
public int compareTo(Node otherNode) {
return node.getName().compareTo(otherNode.getName());
}
然后只需将您的节点添加到<Node>
的SortedSet或TreeMap中。这些类将通过调用节点上的compareTo()
方法为您进行排序。
您希望确保使用hashcode()
和equals()
方法来比较节点的相等性。这是使用集合的一般要求。
如果您需要检查节点是否已存在,请在将值添加到“映射集”之前将其作为单独的任务执行。
if (set.contains(node)) {
// your logic here
}