자체 주문 이진 트리 생성


20

이진 검색 트리를 사용하고 가장 많이 액세스하는 항목 (우선 순위가 높은 항목)이 트리의 최상위에 있고 루트가 가장 많이 액세스되는 노드가되도록 자체 순서로 변경해야하는 할당이 있습니다. .

교수는 나에게 BST와 노드 구조체를 제공했지만 알고리즘을 내 머리에 넣어 트리를 업데이트하려고 시도하는 것은 혼란 스럽습니다.

삽입이 발생함에 따라 현재 노드의 데이터가 현재 노드보다 작거나 큰지 확인한 다음 null 포인터를 찾아서 거기에 삽입 할 때까지 올바른 방향으로 재귀 적으로 진행됩니다. 삽입 된 후 우선 순위가 1 씩 증가합니다.

template <class Type>
void BinarySearchTree<Type> ::  insert( const Type & x, BinaryNode<Type> * & t )
{
    if( t == NULL )
        t = new BinaryNode<Type>( x, NULL, NULL );
    else if( x < t->element )
        insert( x, t->left );
    else if( t->element < x )
        insert( x, t->right );
    else
        t->priority++;  // Duplicate; do nothing for right now
}

이제 노드가 같은지 알아 내야합니다. 현재 노드 (이미 존재하는 노드와 동일)가 기존 노드를 찾아 해당 노드의 우선 순위를 높인 다음 트리를 재정렬하는 방법을 알아야합니다. 루트는 낮은 우선 순위입니다.

AVL 논리가 작동하고 시프트가 발생할 때 단일 회전 오른쪽 또는 단일 회전 왼쪽이라는 아이디어가 있다고 생각합니다.

여기 혼란 스럽습니다. 문제를 해결하기 위해 알고리즘을 만드는 것으로 시작해야 할 곳을 실제로 모릅니다. AVL 알고리즘은 트리의 균형을 추적 한 다음 노드를 왼쪽 또는 오른쪽으로 회전하는 작업을 수행하므로 우선 순위가 가장 높은 노드에는 우선 순위가 높은 자식이없는 균형 조정에 대해 걱정할 필요가 없습니다. .

답변:


12

두 개의 포인터 만 :

  1. 우선 순위 대기열과 이진 검색 트리의 아이디어를 실제로 결합하려면 힙과 BST를 하나의 구조로 결합하는 것을 고려하십시오.
  2. 자체 구성 목록 의 개념이 있습니다 . 아이디어는 동일한 요소에 대한 향후 액세스 속도를 높이기 위해 최근에 액세스 한 요소를 앞쪽으로 (또는쪽으로) 이동하여 시간이 지남에 따라 요소 배포를 "특정 구현에 따른 품질로"학습하는 것입니다. 아마도 이것을 나무에 적용 할 수 있습니까?

스포일러 : 스스로 무언가를 만들 수없는 경우에만 아래 링크를 따르십시오.

1. 이것을 treap 이라고합니다 .
2. 플레이 트리는 이 아이디어를 구현합니다.


2

플레이 트리를 살펴보면 실제로 필요한 것입니다. 액세스 된 각 노드를 트리로 완전히 이동하지 말고 천천히 위쪽으로 splay 기능을 수정해야합니다.


2
왜 것 이 변화를 만들기 위해? 어느 쪽 전략도 실행 가능 하고 다른 전략 도 있습니다. 게다가, 이것은 숙제 질문 /이므로 힌트는 (주석 처리되지 않은) 솔루션보다 선호됩니다. 마지막으로이 답변은 그대로 중복됩니다. 제안 된 솔루션으로 OP를 이끌어 내기 위해 변경 할 수 있습니까?
Raphael

그럼, 당신을 위해 몇 가지 힌트를 : 1. splay 기능을 살펴보고 그것이 무엇을하는지, splay 기능을 수정했는지의 여부에 따라 질문을 읽고 파악하십시오. 우선 순위에 따라 특정 요구 사항을 충족해야하기 때문에 모든 전략을 실행할 수있는 것은 아닙니다. 답변과 주석 처리되지 않은 솔루션은 어떻습니까? 3. "이중화"... 나는 당신의 대답, 죄송합니다, 죄송합니다-힌트가 궁극적이며 내 "
비평 론적
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.