【发布时间】:2016-10-24 04:08:52
【问题描述】:
我正在开发一个 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 方法只是删除了它应该旋转的节点,我尝试调试它但看不出有什么问题。
【问题讨论】:
-
在
balanceTree中对node的分配没有完成任何事情。这可能与stackoverflow.com/questions/40480/… 重复。 -
它应该旋转到哪一边?当它大于左或右时,它会旋转相邻节点,这不是一个无限循环吗?(例如平衡是什么,这到底是不是一个 List 实现,它是按 hitCount 排序的?[提示提示])
-
@ajb 在这种情况下提供的链接有什么帮助? OP 知道机制,但没有正确的分配。
-
@n247s 很难说 OP 是否知道......我看到很多问题,程序员认为分配给参数会对调用者传递的参数产生影响。此外,它符合这个问题:OP 说删除了一个节点,并且由于代码中没有删除,这似乎意味着该节点不再与任何父节点链接 - 如果他通过父节点可能会发生这种情况(
root这里)作为参数并期望它被改变。所以......也许,也许不是。 -
没用。它应该围绕节点本身旋转,而不是相邻节点(它确实进入循环,我已经尝试过)。我尝试创建一个新的临时节点并将其设置为旋转方法返回的值,这确实旋转了节点,但不是以我期望的方式。它的逻辑有问题,但我看不到。
标签: java binary-search-tree tree-balancing