//------------------------------------------------------------------------------ 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) { } } }
//------------------------------------------------------------------------------ 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; }