This commit is contained in:
e2hang
2025-08-09 19:23:37 +08:00
parent ac48a86396
commit 17105e9e9e
13 changed files with 194 additions and 0 deletions

View File

@@ -1,9 +0,0 @@
cmake_minimum_required(VERSION 3.31)
project(BTree)
set(CMAKE_CXX_STANDARD 20)
add_executable(BTree main.cpp
binaryTreeNode.h
binaryTree.h
linkedBinaryTree.h)

View File

@@ -1,22 +0,0 @@
//
// Created by PC on 25-8-6.
//
#ifndef BINARYTREE_H
#define BINARYTREE_H
#include "binaryTreeNode.h"
template <class T>
class binaryTree {
public:
virtual ~binaryTree() = default;
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual void preOrder(void(*) (binaryTreeNode<T>*) ) const = 0;
virtual void inOrder(void(*) (binaryTreeNode<T>*) ) const = 0;
virtual void postOrder(void(*) (binaryTreeNode<T>*) ) const = 0;
virtual void levelOrder(void(*) (binaryTreeNode<T>*) ) const = 0;
};
#endif //BINARYTREE_H

View File

@@ -1,22 +0,0 @@
//
// 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

View File

@@ -1,119 +0,0 @@
//
// Created by PC on 25-8-6.
//
#ifndef LINKEDBINARYTREE_H
#define LINKEDBINARYTREE_H
#include <iostream>
#include <deque>
#include <queue>
#include "binaryTree.h"
#include "binaryTreeNode.h"
template <class T>
class linkedBinaryTree : public binaryTree<T> {
private:
static std::deque<binaryTreeNode<T> *> nodes;
binaryTreeNode<T>* root;
int tsize;
static void (*visit)(binaryTreeNode<T>* node);//存储visit
static void preOrder(binaryTreeNode<T>* node) {
if (node == nullptr) return;
bool isLeaf = (node->left == nullptr && node->right == nullptr);
if (!isLeaf) std::cout << "(";
visit(node);
preOrder(node->left);
preOrder(node->right);
if (!isLeaf) std::cout << ")";
}
static void inOrder(binaryTreeNode<T>* node) {
if (node == nullptr) return;
// 对非叶子节点加括号
bool isLeaf = (node->left == nullptr && node->right == nullptr);
if (!isLeaf) std::cout << "(";
inOrder(node->left);
visit(node);
inOrder(node->right);
if (!isLeaf) std::cout << ")";
}
static void postOrder(binaryTreeNode<T>* node) {
if (node == nullptr) return;
bool isLeaf = (node->left == nullptr && node->right == nullptr);
if (!isLeaf) std::cout << "(";
postOrder(node->left);
postOrder(node->right);
visit(node);
if (!isLeaf) std::cout << ")";
}
//层序遍历levelOrder使用deque这人好聪明
static void levelOrder(binaryTreeNode<T>* node) {
std::deque<binaryTreeNode<T>*> tmp;
tmp.push_back(node);
nodes.push_back(node);
//开始
while (!tmp.empty()) {
binaryTreeNode<T>* current = tmp.front();
tmp.pop_front();
if (current->left != nullptr) {
nodes.push_back(current->left);
tmp.push_back(current->left);
}
if (current->right != nullptr) {
nodes.push_back(current->right);
tmp.push_back(current->right);
}
}
for (binaryTreeNode<T>* x : nodes) {
std::cout << x->element;
}
}
static void dispose(binaryTreeNode<T>* node) {
if (node == nullptr) return;
dispose(node->left);
dispose(node->right);
std::cout << "disposing " << node->element << std::endl;
delete node;
}
public:
linkedBinaryTree() {root = nullptr;tsize = 0;}
explicit linkedBinaryTree(binaryTreeNode<T>* x ) {root = x;tsize = 1;}
~linkedBinaryTree() override {erase();}
bool empty() const override {return tsize == 0;}
void preOrder(void(*Ivisit) (binaryTreeNode<T>*)) const override {visit = Ivisit; preOrder(root);}
//传入的是一个函数在private里有void (*visit)来储存函数入口,从而在遍历的时候进行操作(输出,计算等)
//操作的函数是visit即访问到该node之后进行什么操作
void inOrder(void(*Ivisit) (binaryTreeNode<T>*)) const override{visit = Ivisit; inOrder(root);}
void postOrder(void(*Ivisit) (binaryTreeNode<T>*)) const override {visit = Ivisit; postOrder(root);}
void levelOrder(void(*Ivisit) (binaryTreeNode<T>*)) const override {visit = Ivisit; levelOrder(root);}
int size() const override {return tsize;}
void erase() {
//postOrder(dispose);
dispose(root);
root = nullptr;
tsize = 0;
}
};
//Remember to initiate this Definition by denifying it outside the class but inside the .h file
template<typename T>
void (*linkedBinaryTree<T>::visit)(binaryTreeNode<T>*) = nullptr;
template<typename T>
std::deque<binaryTreeNode<T> *> linkedBinaryTree<T>::nodes;
#endif //LINKEDBINARYTREE_H

View File

@@ -1,55 +0,0 @@
#include <iostream>
#include <string>
#include <vector>
#include "linkedBinaryTree.h"
using namespace std;
vector<string> m;
void func(binaryTreeNode<string>* node) {
cout << node->element;
}
int main() {
/*
* x
* + -
* a b c d
*/
//构建要从下往上构建,注意如果是 new了一个[]必须delete []而不能直接delete t[i]
auto t0 = new binaryTreeNode<string>("a");
auto t1 = new binaryTreeNode<string>("b");
auto t2 = new binaryTreeNode<string>("c");
auto t3 = new binaryTreeNode<string>("d");
auto t4 = new binaryTreeNode<string>("+", t0, t1);
auto t5 = new binaryTreeNode<string>("-", t2, t3);
auto t6 = new binaryTreeNode<string>("x", t4, t5);
linkedBinaryTree<string> tree(t6);
cout << endl;
tree.inOrder(func);
cout << endl;
tree.preOrder(func);
cout << endl;
tree.postOrder(func);
cout << endl;
tree.levelOrder(func);
cout << endl;
return 0;
}
/*
Output:
((a+b)x(c-d))
(x(+ab)(-cd))
((ab+)(cd-)x)
x+-abcd
disposing a
disposing b
disposing +
disposing c
disposing d
disposing -
disposing x
*/

View File

@@ -1,8 +0,0 @@
cmake_minimum_required(VERSION 3.31)
project(priorityQueue)
set(CMAKE_CXX_STANDARD 20)
add_executable(priorityQueue main.cpp
maxPriorityQueue.h
maxPriorityQueueRealise.h)

View File

@@ -1,57 +0,0 @@
#include <iostream>
#include "maxPriorityQueueRealise.h"
using namespace std;
int main() {
maxPriorityQueueRealise<string> q;
vector<pair<string, int>> v;
v.push_back(make_pair("first", 9));
v.push_back(make_pair("second", 8));
v.push_back(make_pair("third", 7));
v.push_back(make_pair("fourth", 6));
v.push_back(make_pair("fifth", 5));
v.push_back(make_pair("sixth", 4));
v.push_back(make_pair("seventh", 1));
v.push_back(make_pair("eighth", 2));
v.push_back(make_pair("ninth", 3));
q.push(v.at(4));
q.push(v.at(3));
q.push(v.at(2));
q.push(v.at(1));
q.push(v.at(0));
q.push(v.at(5));
q.push(v.at(6));
q.push(v.at(7));
q.push(v.at(8));
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
q.pop();
cout << q.top() << endl;
return 0;
}
/*
*发现789的三个顺序倒过来了类的设计正确
*本类设计的是maxpriority如果有重复的priority优先处理先进入的也就是FIFO
*如果有需求修改可以把比较的时候加入等号变成FILO
first
second
third
fourth
fifth
sixth
ninth
eighth
seventh
*/

View File

@@ -1,19 +0,0 @@
//
// Created by PC on 25-8-9.
//
#ifndef MAXPRIORITYQUEUE_H
#define MAXPRIORITYQUEUE_H
template <class T>
class maxPriorityQueue {
public:
virtual ~maxPriorityQueue() = default;
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T& top() = 0;
virtual void pop() = 0;
virtual void push(const std::pair<T, int>& x) = 0;
};
#endif //MAXPRIORITYQUEUE_H

View File

@@ -1,60 +0,0 @@
//
// Created by PC on 25-8-9.
//
#ifndef MAXPRIORITYQUEUEREALISE_H
#define MAXPRIORITYQUEUEREALISE_H
#include "maxPriorityQueue.h"
#include <vector>
template <class T>
class maxPriorityQueueRealise : public maxPriorityQueue<T> {
private:
std::vector<std::pair<T, int>> queue; //T是元素int是优先等级
int qsize;
public:
maxPriorityQueueRealise() : qsize(0) {}
bool empty() const {return qsize == 0;}
int size() const {return qsize;}
T& top();
void pop();
void push(const std::pair<T, int>& x);
};
template<class T>
T& maxPriorityQueueRealise<T>::top() {
int max = -1;
int pos = 0;
int index = 0;
for ( std::pair<T, int> x : queue ) {
if (x.second > max) {
max = x.second;
pos = index;
}
index++;
}
return queue[pos].first;
}
template<class T>
void maxPriorityQueueRealise<T>::pop() {
int max = -1;
int pos = 0;
int index = 0;
for ( std::pair<T, int> x : queue ) {
if (x.second > max) {
max = x.second;
pos = index;
}
index++;
}
queue.erase(queue.begin() + pos);
}
template<class T>
void maxPriorityQueueRealise<T>::push(const std::pair<T, int>& x) {
queue.push_back(x);
}
#endif //MAXPRIORITYQUEUEREALISE_H