히트는 find(), contains() 등을 사용하여 노드를 찾을 때 증가하는 특성 인 히트 및 해당 요소에 따라 노드의 균형을 조정하는 BST에서 작업하고 있습니다. 트리의 루트는 적중 횟수가 가장 많은 노드입니다. 내 코드는 모두 괜찮 았지만 균형을 맞추는 방법은 제외하고 균형을 조정합니다. 수정 된 AVL Tree rotate 메서드 (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;
}
것은 지금 밸런스 방법은 단순히 노드는 삭제됩니다 회전해야하는데, 디버깅을 시도했지만 잘못된 것을 볼 수 없었습니다.
'balanceTree'에서'node'에 대한 할당은 아무 것도 달성하지 못합니다. 이것은 http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value의 중복 일 수 있습니다. – ajb
어느쪽으로 회전해야합니까? 어느 쪽이 왼쪽 또는 오른쪽보다 큰 경우, 이웃 노드를 회전 시키면 무한 루프가되지 않습니까? (예를 들어, 무엇이 균형입니까, 결국 hitCount에서 정렬되는이 List 구현은 아닙니까? [힌트 힌트]) – n247s
@ajb 이 경우 제공된 링크가 어떻게 도움이됩니까? OP는 적절한 메커니즘을 가지고 있지만 메커니즘을 알고 있습니다. – n247s