Files
Data-Structure/BinaryTree/priorityQueue/maxWBLT/maxWBLT.h
e2hang 3c33c80a72 WBLT
2025-08-10 23:24:21 +08:00

128 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by PC on 25-8-10.
//
#ifndef MAXHBLT_H
#define MAXHBLT_H
#include <utility>
#include <iostream>
#include <vector>
#include "binaryTreeNode.h"
template<class T>
class maxWBLT {
private:
binaryTreeNode<std::pair<int, T>>* root;
int bsize;
std::vector<binaryTreeNode<std::pair<int, T>>*> data;
static void meld(binaryTreeNode<std::pair<int, T>>* &x, binaryTreeNode<std::pair<int, T>>* &y);
public:
maxWBLT() : root(nullptr), bsize(0) {}
maxWBLT(binaryTreeNode<std::pair<int, T>>* 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<std::pair<int, T>>* r) {
if (r == nullptr) return;
if (r->left != nullptr) dispose(r->left);
if (r->right != nullptr) dispose(r->right);
delete r;
}
};
template<class T>
maxWBLT<T>::~maxWBLT() {
dispose(root);
root = nullptr;
bsize = 0;
}
template<class T>
void maxWBLT<T>::push(const T& x) {
if (root == nullptr) {
root = new binaryTreeNode<std::pair<int, T>>(std::make_pair(1, x));
return;
}
auto tmp = new binaryTreeNode<std::pair<int, T>>(std::make_pair(1, x));
meld(root, tmp);
bsize++;
}
template<class T>
void maxWBLT<T>::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<class T>
void maxWBLT<T>::meld(maxWBLT &y) {
meld(root, y.root);
bsize += y.bsize;
y.dispose(y.root);
y.root = nullptr;
y.bsize = 0;
}
template<class T>
void maxWBLT<T>::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<class T>
void maxWBLT<T>::meld(binaryTreeNode<std::pair<int, T>>*& x, binaryTreeNode<std::pair<int, T>>*& 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