二叉搜索树
This commit is contained in:
parent
5a311c3481
commit
facc1e87d5
@ -3,4 +3,4 @@ project(demo)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
|
||||
add_executable(demo HashTable.cpp)
|
||||
add_executable(demo SearchTree.cpp)
|
||||
|
@ -15,7 +15,7 @@ struct node_base {
|
||||
template <class T, class T1>
|
||||
class List {
|
||||
public:
|
||||
List(size_t l = 10)
|
||||
explicit List(size_t l = 10)
|
||||
: node(new node_base<T>()), last(node), len(l), size(0) {
|
||||
node_base<T>* for_old = nullptr;
|
||||
node_base<T>* current = last;
|
||||
@ -86,6 +86,9 @@ public:
|
||||
}
|
||||
}
|
||||
virtual ~HashMap() {
|
||||
for (int i = 0; i < size; ++i) {
|
||||
delete table[i];
|
||||
}
|
||||
delete table;
|
||||
}
|
||||
public:
|
||||
|
139
SearchTree.cpp
Normal file
139
SearchTree.cpp
Normal file
@ -0,0 +1,139 @@
|
||||
//
|
||||
// Created by Administrator on 2023/7/19.
|
||||
//
|
||||
|
||||
#include <list>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* 二叉搜索树 左子树 永远比跟小 右子树 永远比根大
|
||||
* 搜索时与根与比较时左走右走
|
||||
*/
|
||||
|
||||
template <class T>
|
||||
struct tree_node {
|
||||
tree_node* left = nullptr;
|
||||
tree_node* right = nullptr;
|
||||
std::list<T> data;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class SearchTree {
|
||||
public:
|
||||
explicit SearchTree(size_t len = 30)
|
||||
: root_node(new tree_node<T>()), size(0) {
|
||||
for (int i = 0; i < len; ++i) {
|
||||
node_barrel.push_back(new tree_node<T>());
|
||||
}
|
||||
}
|
||||
virtual ~SearchTree() {
|
||||
for (const auto &item: node_barrel) {
|
||||
delete item;
|
||||
}
|
||||
delete root_node;
|
||||
}
|
||||
|
||||
public:
|
||||
void insert(T data) {
|
||||
// 无可用节点
|
||||
if (size >= node_barrel.size() + 1) {
|
||||
for (int i = 0; i < node_barrel.size(); ++i) {
|
||||
node_barrel.push_back(new tree_node<T>());
|
||||
}
|
||||
}
|
||||
|
||||
tree_node<T>* current = root_node;
|
||||
while (current != nullptr) {
|
||||
// 判断树节点是否有值
|
||||
if (current->data.empty()) {
|
||||
current->data.push_back(data);
|
||||
return;
|
||||
}
|
||||
// 值一致
|
||||
else if (current->data.front() == data){
|
||||
current->data.push_back(data);
|
||||
return;
|
||||
}
|
||||
// 值小
|
||||
else if (current->data.front() > data) {
|
||||
// 判断相应节点是否存在
|
||||
if (current->left == nullptr) {
|
||||
// 连接新节点
|
||||
current->left = node_barrel[size++];
|
||||
current->left->data.push_back(data);
|
||||
|
||||
return;
|
||||
} else {
|
||||
current = current->left;
|
||||
}
|
||||
}
|
||||
// 值大
|
||||
else if (current->data.front() < data) {
|
||||
// 判断相应节点是否存在
|
||||
if (current->right == nullptr) {
|
||||
// 连接新节点
|
||||
current->right = node_barrel[size++];
|
||||
current->right->data.push_back(data);
|
||||
return;
|
||||
} else {
|
||||
current = current->right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tree_node<T>* find(T data) {
|
||||
tree_node<T>* current = root_node;
|
||||
while (current != nullptr) {
|
||||
if (current->data.front() == data) {
|
||||
return current;
|
||||
}
|
||||
else if(current->data.front() > data) {
|
||||
current = current->left;
|
||||
}
|
||||
else if(current->data.front() < data) {
|
||||
current = current->right;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void erase(T data) {
|
||||
|
||||
}
|
||||
|
||||
void update(T old_data, T new_data) {
|
||||
|
||||
}
|
||||
|
||||
const std::vector<tree_node<T> *> &nodeBarrel() const {
|
||||
return node_barrel;
|
||||
}
|
||||
|
||||
private:
|
||||
// 根节点
|
||||
tree_node<T>* root_node;
|
||||
// 节点桶
|
||||
std::vector<tree_node<T> *> node_barrel;
|
||||
// 有效节点大小
|
||||
size_t size;
|
||||
};
|
||||
|
||||
|
||||
int main() {
|
||||
SearchTree<int> searchTree;
|
||||
searchTree.insert(30);
|
||||
searchTree.insert(1);
|
||||
searchTree.insert(50);
|
||||
searchTree.insert(5);
|
||||
searchTree.insert(150);
|
||||
searchTree.insert(15);
|
||||
searchTree.insert(5);
|
||||
auto node = searchTree.find(5);
|
||||
for (const auto &item: node->data) {
|
||||
printf("%d ", item);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user