插入和搜索二叉搜索树

时间:2019-03-31 15:12:20

标签: java algorithm binary-search-tree

我的BST遇到问题。我应该构建的BST具有一个隐式的“等级”,其中对节点进行了排序。例如,当插入一个新节点时,我会得到一个要存储在节点中的值以及插入它的级别。换句话说,BST应该存储一个序列。我的insert函数似乎可以正常工作,但偶尔会出现一些小错误,而select函数应该在不应该的情况下抛出NullPointerException。

Node.java

RBST.java

RBSTTest.java

public void insertNormal(int team, int rank)
{
    root = insertNormal(root, team, rank);
}

 /**
 * Insert the data team at position rank into node T. This is the normal
 * insert routine without any balancing.
 */
private Node insertNormal(Node T, int team, int rank)
{
    assert (rank >= 1 && rank <= T.getSize() + 1) : "rank should be between 1 and size of the tree <"
        + (T.getSize() + 1) + ">";

    if (T == null)
    {
        return new Node(team);
    }

    if (getRank(T) >= rank)
    {
        T.setLeft(insertNormal(T.getLeft(), team, rank));
    }
    else
    {
        T.setRight(insertNormal(T.getRight(), team, rank));
    }
    T.incSize();

    return T;
}


public Node select(int rank)
{
    return select(root, rank);
}

/**
 * The select method that returns the node in the tree at position rank.
 */
private Node select(Node T, int rank)
{
    if (T == null || getRank(T) == rank)
        return T;

    assert (rank >= 1 && rank <= T.getSize()) : "rank should be between 1 and size of the tree <" + T.getSize()
        + "> ";

    if (getRank(T) > rank)
        T = T.getLeft();
    else
        T = T.getRight();

    return select(T, rank);
}

public int getRank(Node T)
{
    return (T.getLeft() == null ? 1 : T.getLeft().getSize() + 1);
}

1 个答案:

答案 0 :(得分:0)

二进制搜索树的构造有点奇怪。显然,您事先知道球队的排名。在这种情况下,您通常会将队伍的排名存储在Node中。然后,您以后可以轻松检索排名。这样,您也不会被迫按队伍等级添加队伍。

您当前的getRank()方法当前实际上未检索到排名。请注意,如果现在按排名顺序添加团队,您将得到一棵非常高大的旁侧树,子树始终在右侧,而左侧总是null。您的错误来自哪里也很可能:getRank()将始终返回1。

相关问题