作者:爱写代码的刚子
时间:2024.1.20
前言:本篇博客的代码均为自己独立完成,可能会有瑕疵
#include#include #include using namespace std; template class TreeNode { public: TreeNode(const T&value) :_parent(nullptr) ,_left(nullptr) ,_right(nullptr) ,_value(value) ,_a(0) {} TreeNode(const T&value,const int& a) :_parent(nullptr) ,_left(nullptr) ,_right(nullptr) ,_value(value) ,_a(a) {} TreeNode* _parent; TreeNode* _left; TreeNode* _right; T _value; int _a; }; template class Huffman_tree { typedef TreeNode Node; public: Huffman_tree() :_root(nullptr) {} template struct greater { bool operator()(const F & x,const F & y) const { if(x->_value==y->_value) { printf("equal\n"); return x->_a>y->_a; } return x->_value>y->_value; } }; void creat_Huffman_tree(vector v) { sort(v.begin(),v.end()); priority_queue ,greater > pq; for(auto& e:v) { Node* node=new Node(e); pq.push(node); } while(!pq.empty()) { Node *left = pq.top(); pq.pop(); Node *right = nullptr; if (!pq.empty()) { right = pq.top(); pq.pop(); } else { _root = left; return; } Node *parent = new Node(left->_value + right->_value, 1); left->_parent = parent; right->_parent = parent; parent->_left = left; parent->_right = right; //test(parent); pq.push(parent); } } void Print() { Node* copy=_root; _Print(copy); cout<<"这是前序遍历\n"< _test(test); cout< if(root==nullptr) { return; } cout< _value<<" "; _Print(root->_left); _Print(root->_right); } void _test(Node* test) { if(test==nullptr) { return; } cout< _value<<" "; _Print(test->_left); _Print(test->_right); } };
int main() { vectorv{19,21,32,2,3,6,7,10}; vector v1{3,4,5,6,7,8,9}; Huffman_tree hf; hf.creat_Huffman_tree(v); hf.Print(); return 0; }
采用优先级队列,将数据进行插入处理。
这个代码还有优化的地方:creat_Huffman_tree(v);采用了vector的拷贝构造,可以换成迭代器直接构造。
核心函数: void creat_Huffman_tree(vector
上一篇:rem布局