如何根据字符串数据在树中排序节点?

时间:2014-11-19 02:19:31

标签: java tree binary-tree

以下是我目前添加新节点的代码(在同一级别上)。这是在添加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号航班

不是世界末日,因为它只是一个家庭作业项目,但我不确定是否有人对此有任何快速修复。谢谢!

1 个答案:

答案 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
}