Java AVL树有效地更新大小

时间:2014-09-01 18:45:02

标签: java recursion

目前我已设法将所有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;
}

0 个答案:

没有答案