我的BST遇到问题。我应该构建的BST具有一个隐式的“等级”,其中对节点进行了排序。例如,当插入一个新节点时,我会得到一个要存储在节点中的值以及插入它的级别。换句话说,BST应该存储一个序列。我的insert函数似乎可以正常工作,但偶尔会出现一些小错误,而select函数应该在不应该的情况下抛出NullPointerException。
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);
}
答案 0 :(得分:0)
二进制搜索树的构造有点奇怪。显然,您事先知道球队的排名。在这种情况下,您通常会将队伍的排名存储在Node
中。然后,您以后可以轻松检索排名。这样,您也不会被迫按队伍等级添加队伍。
您当前的getRank()
方法当前实际上未检索到排名。请注意,如果现在按排名顺序添加团队,您将得到一棵非常高大的旁侧树,子树始终在右侧,而左侧总是null
。您的错误来自哪里也很可能:getRank()
将始终返回1。