BinaryTree
This commit is contained in:
9
LinearList/BinaryTree/CMakeLists.txt
Normal file
9
LinearList/BinaryTree/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.31)
|
||||||
|
project(BTree)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
|
||||||
|
add_executable(BTree main.cpp
|
||||||
|
binaryTreeNode.h
|
||||||
|
binaryTree.h
|
||||||
|
linkedBinaryTree.h)
|
0
LinearList/BinaryTree/CMakeList的具体写法
Normal file
0
LinearList/BinaryTree/CMakeList的具体写法
Normal file
22
LinearList/BinaryTree/binaryTree.h
Normal file
22
LinearList/BinaryTree/binaryTree.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// 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
|
22
LinearList/BinaryTree/binaryTreeNode.h
Normal file
22
LinearList/BinaryTree/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
|
117
LinearList/BinaryTree/linkedBinaryTree.h
Normal file
117
LinearList/BinaryTree/linkedBinaryTree.h
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void (*linkedBinaryTree<T>::visit)(binaryTreeNode<T>*) = nullptr;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::deque<binaryTreeNode<T> *> linkedBinaryTree<T>::nodes;
|
||||||
|
|
||||||
|
#endif //LINKEDBINARYTREE_H
|
55
LinearList/BinaryTree/main.cpp
Normal file
55
LinearList/BinaryTree/main.cpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#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
|
||||||
|
*/
|
Reference in New Issue
Block a user