WBLT
This commit is contained in:
		
							
								
								
									
										6
									
								
								BinaryTree/priorityQueue/maxWBLT/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								BinaryTree/priorityQueue/maxWBLT/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.31)
 | 
			
		||||
project(maxWBLT)
 | 
			
		||||
 | 
			
		||||
set(CMAKE_CXX_STANDARD 20)
 | 
			
		||||
 | 
			
		||||
add_executable(maxWBLT main.cpp)
 | 
			
		||||
							
								
								
									
										22
									
								
								BinaryTree/priorityQueue/maxWBLT/binaryTreeNode.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								BinaryTree/priorityQueue/maxWBLT/binaryTreeNode.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
//
 | 
			
		||||
// Created by PC on 25-8-6.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef BINARYTREENODE_H
 | 
			
		||||
#define BINARYTREENODE_H
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
class binaryTreeNode {
 | 
			
		||||
public:
 | 
			
		||||
    T element;
 | 
			
		||||
    binaryTreeNode<T>* left;
 | 
			
		||||
    binaryTreeNode<T>* right;
 | 
			
		||||
public:
 | 
			
		||||
    binaryTreeNode() {left = right = nullptr;}
 | 
			
		||||
    explicit binaryTreeNode(const T& e)  : element(e), left(nullptr), right(nullptr) {}
 | 
			
		||||
    binaryTreeNode(const T& e, binaryTreeNode<T>* l, binaryTreeNode<T>* r) : element(e), left(l), right(r) {}
 | 
			
		||||
    ~binaryTreeNode() = default;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif //BINARYTREENODE_H
 | 
			
		||||
							
								
								
									
										34
									
								
								BinaryTree/priorityQueue/maxWBLT/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								BinaryTree/priorityQueue/maxWBLT/main.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
#include "maxWBLT.h"
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    /*
 | 
			
		||||
Tree1
 | 
			
		||||
     50
 | 
			
		||||
    /  \
 | 
			
		||||
  40    30
 | 
			
		||||
 /  \
 | 
			
		||||
20   10
 | 
			
		||||
Tree2
 | 
			
		||||
     45
 | 
			
		||||
    /  \
 | 
			
		||||
  35    25
 | 
			
		||||
 /  \
 | 
			
		||||
15   5
 | 
			
		||||
*/
 | 
			
		||||
    maxWBLT<int> t1,t2;
 | 
			
		||||
    t1.push(50);t1.push(30);t1.push(40);t1.push(20);t1.push(10);
 | 
			
		||||
    t2.push(45);t2.push(25);t2.push(35);t2.push(15);t2.push(5);
 | 
			
		||||
    t1.display();
 | 
			
		||||
    t2.display();
 | 
			
		||||
    //正确的树
 | 
			
		||||
    t1.meld(t2);
 | 
			
		||||
    t1.display();
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
最后输出了
 | 
			
		||||
{5, 50}, {2, 40}, {2, 30}, {1, 20}, {1, 10},
 | 
			
		||||
{5, 45}, {2, 35}, {2, 25}, {1, 15}, {1, 5},
 | 
			
		||||
{10, 50}, {7, 45}, {2, 40}, {4, 30}, {2, 35}, {1, 20}, {2, 25}, {1, 10}, {1, 15}, {1, 5},
 | 
			
		||||
与预测一致,详情见README.MD
 | 
			
		||||
*/
 | 
			
		||||
							
								
								
									
										127
									
								
								BinaryTree/priorityQueue/maxWBLT/maxWBLT.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								BinaryTree/priorityQueue/maxWBLT/maxWBLT.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
			
		||||
//
 | 
			
		||||
// 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
 | 
			
		||||
		Reference in New Issue
	
	Block a user