我正在研究一个 BST,它将根据节点的命中及其元素平衡节点,其中命中是一个属性,当使用 find()、contains() 等找到节点时该属性会增加。树的根是节点具有最高的点击次数。我所有的代码都很好,除了在我增加命中后平衡树的平衡方法。我正在使用修改后的 AVL 树旋转方法(https://users.cs.fiu.edu/~weiss/dsj2/code/weiss/nonstandard/Rotations.java),我不比较元素,而是比较一个节点。无论我尝试什么,我都无法让它工作,我无法让树正确平衡这是我到目前为止的代码:
public void balanceTree() {
balanceTree(root);
}
private void balanceTree(Node node) {
if (node.left.getHits() <= node.getHits() && node.right.getHits() <= node.getHits()) {
return;
} else if (node.left.getHits() > node.getHits()) {
node = rotateWithLeftChild(node);
} else if (node.right.getHits() > node.getHits()) {
node = rotateWithRightChild(node);
}
}
static Node rotateWithLeftChild(Node k2) {
Node k1 = k2.left;
k2.left = k1.right;
k1.right = k2;
return k1;
}
static Node rotateWithRightChild(Node k1) {
Node k2 = k1.right;
k1.right = k2.left;
k2.left = k1;
return k2;
}
现在 balance 方法只是删除了它应该旋转的节点,我尝试调试它但看不出有什么问题。