diff --git a/CMakeLists.txt b/CMakeLists.txt index 19a9da2..9496c61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ project(demo) set(CMAKE_CXX_STANDARD 11) -add_executable(demo HashTable.cpp) +add_executable(demo SearchTree.cpp) diff --git a/HashTable.cpp b/HashTable.cpp index e8729f4..07fa98e 100644 --- a/HashTable.cpp +++ b/HashTable.cpp @@ -15,7 +15,7 @@ struct node_base { template class List { public: - List(size_t l = 10) + explicit List(size_t l = 10) : node(new node_base()), last(node), len(l), size(0) { node_base* for_old = nullptr; node_base* current = last; @@ -86,6 +86,9 @@ public: } } virtual ~HashMap() { + for (int i = 0; i < size; ++i) { + delete table[i]; + } delete table; } public: diff --git a/SearchTree.cpp b/SearchTree.cpp new file mode 100644 index 0000000..f396a34 --- /dev/null +++ b/SearchTree.cpp @@ -0,0 +1,139 @@ +// +// Created by Administrator on 2023/7/19. +// + +#include +#include +#include + +/** + * 二叉搜索树 左子树 永远比跟小 右子树 永远比根大 + * 搜索时与根与比较时左走右走 + */ + +template +struct tree_node { + tree_node* left = nullptr; + tree_node* right = nullptr; + std::list data; +}; + +template +class SearchTree { +public: + explicit SearchTree(size_t len = 30) + : root_node(new tree_node()), size(0) { + for (int i = 0; i < len; ++i) { + node_barrel.push_back(new tree_node()); + } + } + 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()); + } + } + + tree_node* 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* find(T data) { + tree_node* 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 *> &nodeBarrel() const { + return node_barrel; + } + +private: + // 根节点 + tree_node* root_node; + // 节点桶 + std::vector *> node_barrel; + // 有效节点大小 + size_t size; +}; + + +int main() { + SearchTree 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); + } +} \ No newline at end of file