하프 만 트 리 (코드 구현)
우 리 는 먼저 하프 만 트 리 노드 의 데이터 구 조 를 정의 합 니 다.
struct haffManTreeNode //
{
char symbol; //
int weight; //
haffManTreeNode* lChild;
haffManTreeNode* rChild;
};
struct haffManTreeRoot // ,
{
haffManTreeNode* next;
};
haffManTreeNode* initHaffManTreeNode(char symbol,int weight)
{
//
haffManTreeNode* tree = new haffManTreeNode;
tree->lChild = NULL;
tree->rChild = NULL;
tree->symbol = symbol;
tree->weight = weight;
return tree;
}
나무 노드 가 생 긴 후에 우 리 는 서로 다른 노드 의 가중치 를 저장 하고 그들 을 정렬 시 켜 이 노드 로 우리 의 하프 만 나 무 를 구성 해 야 한다.
struct haffManQueue //
{
haffManTreeNode* tree; //
int weight; //
haffManQueue* next;
};
struct haffManQueueHead // , ,
{
int size;
haffManQueue* next;
};
haffManQueue* initQueue()
{
//
haffManQueue* queue = new haffManQueue;
queue->weight = 0;
queue->tree = NULL;
queue->next = NULL;
return queue;
}
가장 기본 적 인 데이터 구 조 를 정의 한 후에 우 리 는 하나의 배열 을 얻어 텍스트 의 단일 문자 출현 횟수 (가중치) 를 저장 해 야 한다. 여기 서 우 리 는 배열 아래 표 시 를 이용 하여 이 기능 을 실현 해 야 한다.
void getWeight(string& str,int (&weight)[256])
{
// , ,
// :(1) ,
//(2) 256 ,
for(int i=0;i <= 255;i++)
{
//
weight[i] = 0;
}
int count = str.length();
for(int i=0;i < count;i++)
{
// ascii
weight[ (char)str[i] ]++;
}
}
그 다음 에 우 리 는 이 가중치 배열 을 가지 게 되 었 다. 그러면 우리 에 게 필요 한 것 은 하 프 만 트 리 의 구축 과정 에 따라 코드 를 실현 하 는 것 이다.
// , 。。。
// : , head ,
void insertQueue(haffManQueueHead* (&head),haffManQueue* (&inserter),haffManQueue* (&address))
{
// address inserter , address NULL,
if(address == NULL)
{
inserter->next = head->next;
head->next = inserter;
}
else if(address->next == NULL)
{
address->next = inserter;
}
else
{
inserter->next = address->next;
address->next = inserter;
}
}
// ,
haffManQueue* getQueueItem(haffManQueueHead* (&head))
{
if(head->size == 0)
{
return NULL;
}
haffManQueue* temp = head->next;
head->next = head->next->next;
head->size--;
return temp;
}
// ,
haffManQueueHead* initHaffManQueue(int (&weight)[256])
{
//
haffManQueueHead* head = new haffManQueueHead;
head->next = NULL;
head->size = 0;
for(int i=0;i <= 255;i++)
{
if(weight[i] != 0)
{
if(head->size == 0)
{
// ,
haffManQueue* queue = initQueue();
queue->tree = initHaffManTreeNode((char)i,weight[i]);
queue->weight = queue->tree->weight;
head->next = queue;
head->size++;
}
else
{
haffManQueue* queue = initQueue();
queue->tree = initHaffManTreeNode((char)i,weight[i]);
queue->weight = queue->tree->weight;
// ,
haffManQueue* temp = head->next;
// , ,
haffManQueue* preNode = NULL;
while(queue->weight > temp->weight && temp != NULL)
{
preNode = temp;
temp = temp->next;
}
insertQueue(head,queue,preNode);
head->size++;
}
}
}
return head;
}
// ,
haffManTreeRoot* creataHaffManTree(haffManQueueHead* (&head))
{
//
haffManTreeRoot* root = new haffManTreeRoot;
root->next = NULL;
if(head->size == 0)
{
return root;
}
else
{
while(head->size != 1)
{
// ,
haffManQueue* lChild = getQueueItem(head);
haffManQueue* rChild = getQueueItem(head);
haffManQueue* newNode = initQueue();
// '\0', ,
newNode->tree = initHaffManTree('\0',lChild->weight+rChild->weight);
//
newNode->tree->lChild = lChild->tree;
newNode->tree->rChild = rChild->tree;
newNode->weight = newNode->tree->weight;
// ,
if(head->size == 0)
{
head->next = newNode;
head->size++;
}
else
{
haffManQueue* temp = head->next;
haffManQueue* preNode = NULL;
while(newNode->weight > temp->weight && temp != NULL)
{
preNode = temp;
temp = temp->next;
}
insertQueue(head,newNode,preNode);
head->size++;
}
}
}
root->next = head->next->tree;
return root;
}
이것 이 바로 내 개인 적 으로 하프 만 나무의 실현 과정 에 관 한 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.