이 다른 솔루션 수 있지만 하나는 다음과 같습니다 수 있습니다
이 시켜서 (해당 통화가 왼쪽이나 오른쪽 서브 트리에 노드를 추가할지 여부를 추적한다 각 재귀 호출에 재귀 항목을 추가 할 때 예를 들어 add 함수가이를 반환합니다. 재귀 호출 후 높이 불변성을 확인합니다. 삽입 후 해당 노드에서 위반되었다는 것을 알게되면 불균형에 대한 경로를 알게됩니다.
일부 (불완전) 의사 코드 :
add(item, node):
if item < node.value //should add to left subtree
if node.left is empty
//add item here
else
addedLeft := add(item, node.left)
if node.left.height - node.right.height > 1
if addedLeft
//you know the path to the subtree causing the imbalance is LL, do a RR (single-right) rotation
else
//path is LR, do a LR (double-right) rotation
...
재귀 호출이 추가 된 노드에서 상향식 (bottom-up)을 전개하고 일반적인 생각이되는 불변 (있는 경우)을 위반 노드 확인하는 것입니다. 해당 노드가 발견되면 불균형을 초래하는 하위 트리에 대한 경로를 알아야합니다. 어떻게 든이 문제를 해결해야합니다. 이것이 하나의 해결책입니다.
특정 작업으로 간주됩니까? 예 : 트리에 노드를 추가 한 다음 밸런스 속성을 유지? – niklon
추가 및 제거 모두에서, 그러나 내가 이해한다면, 다른 하나는 쉽게 알 수 있다고 상상해보십시오. 나는 나무가 항상 균형을 유지하기를 원하지만, 수정되는 유일한 시간은 요소를 추가하거나 제거하는 것이므로 다른 순간을 볼 수 없습니다. ** 그러나 ** – Kalec