// // Created by PC on 25-8-10. // #ifndef MAXHBLT_H #define MAXHBLT_H #include #include #include #include "binaryTreeNode.h" template class maxWBLT { private: binaryTreeNode>* root; int bsize; std::vector>*> data; static void meld(binaryTreeNode>* &x, binaryTreeNode>* &y); public: maxWBLT() : root(nullptr), bsize(0) {} maxWBLT(binaryTreeNode>* r, int b) : root(r), bsize(b) {} ~maxWBLT(); void push(const T& x); void pop(); void meld(maxWBLT &y); void initialize() {} void display(); T& top() {return root->element.second;} bool empty() {return bsize == 0;} int size() {return bsize;} void dispose(binaryTreeNode>* r) { if (r == nullptr) return; if (r->left != nullptr) dispose(r->left); if (r->right != nullptr) dispose(r->right); delete r; } }; template maxWBLT::~maxWBLT() { dispose(root); root = nullptr; bsize = 0; } template void maxWBLT::push(const T& x) { if (root == nullptr) { root = new binaryTreeNode>(std::make_pair(1, x)); return; } auto tmp = new binaryTreeNode>(std::make_pair(1, x)); meld(root, tmp); bsize++; } template void maxWBLT::pop() { if (root == nullptr) { std::cerr << "Empty Error!" << std::endl; } auto left = root->left; auto right = root->right; delete root; root = nullptr; meld(left, right); bsize--; } template void maxWBLT::meld(maxWBLT &y) { meld(root, y.root); bsize += y.bsize; y.dispose(y.root); y.root = nullptr; y.bsize = 0; } template void maxWBLT::display() { if (root == nullptr) { std::cerr << "Empty Error!" << std::endl; return; } data.clear(); data.push_back(root); int cnt = 0; while (cnt < bsize) { if (data.at(cnt)->left != nullptr) data.push_back(data.at(cnt)->left); if (data.at(cnt)->right != nullptr) data.push_back(data.at(cnt)->right); cnt++; } for (auto x : data) { std::cout << "{" << x->element.first << ", " << x->element.second << "}" << ", "; } std::cout << std::endl; } //重要 -> 合并两个子树,把y合并进入x //* &x,指针的引用,表示指针可以修改(传入函数) //关注:统计树的特定数据的时候一定要从下往上统计(类似后序遍历),优先汇总叶子,最后汇总到根 template void maxWBLT::meld(binaryTreeNode>*& x, binaryTreeNode>*& y) { if (y == nullptr) return; if (x == nullptr) { x = y; y = nullptr; return; } if (x->element.second < y->element.second) std::swap(x, y); meld(x->right, y); // 左重性检查,写成两个变量更好,更清晰 int lw = x->left ? x->left->element.first : 0; int rw = x->right ? x->right->element.first : 0; if (lw < rw) std::swap(x->left, x->right); x->element.first = 1 + lw + rw; } #endif //MAXHBLT_H