示例#1
0
//------------------------------------------------------------------------------
void Tree::makeNodeList (NodePtr p)
{
	if (p)
	{
		makeNodeList (p->GetChild ());
		makeNodeList (p->GetSibling ());
		if (p->IsLeaf())
		{
			int leafnumberposition=p->GetLeafNumber()-1;//modified by BCO
			string plabel=p->GetLabel(); //modified by BCO
			LeafList[plabel] = leafnumberposition; //modified by BCO
			assert((Leaves+Internals)>leafnumberposition);
			Nodes[leafnumberposition] = p; //modified by BCO
			p->SetIndex (leafnumberposition); //modified by BCO
		}
		else
		{
			Nodes[count] = p;
			p->SetIndex (count);
			count++;
		}
		if (p != Root)
		{
		}
	}
}
示例#2
0
//------------------------------------------------------------------------------
void Tree::MakeNodeList ()
{
	Update();//to ensure number of leaves and internals is correct //Added by BCO
	if (Nodes!=NULL) { //Added by BCO 
		delete [] Nodes; //Added by BCO
		Nodes=NULL; //Added by BCO
	} //Added by BCO
//	if (Nodes == NULL)// deleted by BCO: we will always delete the old node arrary and make a new one
//	{
		Nodes = new NodePtr [Leaves + Internals];
//	}
	count = Leaves;
	makeNodeList (Root);
}
void makeHuffmanTree( Node** out, long* frequency, int numChars, Node** pListBuf ){
	Node* start = makeNodeList( frequency, numChars );
	
	// Store base pointers in the list for quick access while encoding.
	
	Node* sorted;
    Node* arr;
	//Assume sorted is a new array.


	sortNodes( start, &sorted, &arr );
	
	for (int i = 0; i < numChars; i++ ) {
		pListBuf[i] = arr + i;
	}

	while (1) {
		Node* n1 = sorted;
		Node* n2 = sorted->next;
		if( n2 == NULL )
			break;
		Node* merged = newNode( 0, n1->freq + n2->freq );
		
        printf("Merging %ld, %ld\n", n1->freq, n2->freq);fflush( stdout );
		merged->left = n1;
		merged->right = n2;
		
		n1->parent = merged;
		n2->parent = merged;
		
		sorted = (sorted->next->next);
        if( sorted != NULL )
		    sorted = insertSorted( sorted, merged );
        else
            sorted = merged;
	}
	*out = sorted;
	
}