目前我已设法将所有4个旋转代码都正确。我现在的问题是获取系统定义的范围内的单词。它包括系统提供的结束停用词的开始和排除。
我用来获取单词总数的方法正常工作,因为我正在使用nodeSize
方法,它是左右子树和自身的添加[left subtree + rightsubtree + 1] 。获取范围中的单词的差异或数量,因为起始和结束单词都有重叠点。
我用来更新AVL树中所有节点大小的内容是在inorder方法中实现nodeSize
方法。这很好,因为我之前已经检查过小范围的细节。现在唯一的问题是,当树中有超过10,000个节点并且超过5000个查询时,我遇到了如何使其更加节省时间。
public int nodeSize(BSTVertex T) {
if (T == null) {
return 0;
} else {
return nodeSize(T.left) + nodeSize(T.right) + 1;
}
}
public void insert(String v) {
root = insert(root, v);
}
protected BSTVertex insert(BSTVertex T, String v) {
if (T == null) {
return new BSTVertex(v);
}
if (T.key.compareTo(v) < 0) {
T.right = insert(T.right, v);
T.right.parent = T;
} else {// search to the left
T.left = insert(T.left, v);
T.left.parent = T;
}
T.totalNode = nodeSize(T);
int balance = nodeHeight(T.left) - nodeHeight(T.right);
if (balance == 2) {
int balance2 = nodeHeight(T.left.left) - nodeHeight(T.left.right);
if (balance2 == 1) {
T = rightRotation(T);
} else {//Left Right Case 2,-1
T.left = rotateLeft(T.left);
T = rightRotation(T);
}
}
if (balance == -2) {
int balance2 = nodeHeight(T.right.left) - nodeHeight(T.right.right);
if (balance2 == -1) {
T = rotateLeft(T); //single left for -1
} else {//Right left case, -2,1
T.right = rightRotation(T.right);
T = rotateLeft(T);
}
}
inorder(T);
return T;
}