#ifndef INDEXBINARYSEARCHTREE_H #define INDEXBINARYSEARCHTREE_H #include #include "binaryTreeNode.h" template class indexBinarySearchTree { private: binaryTreeNode* root; int treeSize; int leftSize; void inOrder(binaryTreeNode* node); public: indexBinarySearchTree() : root(nullptr), leftSize(0) {} indexBinarySearchTree(const indexBinarySearchTree& e) : leftSize(e.leftSize) { //深拷贝 采取中序遍历的方法 } std::pair* find(const K& e); void insert(const std::pair& e); void erase(const K& e); void ascent(); }; template void indexBinarySearchTree::inOrder(binaryTreeNode *node) { if (node == nullptr) return; inOrder(node->left); std::cout << node->element.second << " "; inOrder(node->right); } template std::pair * indexBinarySearchTree::find(const K &e) { binaryTreeNode *current = root; while (current != nullptr) { if (current->element.first < e) { current = current->right; } else if (current->element.first > e) { current = current->left; } else { return ¤t->element; } } //没有匹配的 return nullptr; } template void indexBinarySearchTree::insert(const std::pair &e) { binaryTreeNode* pp = nullptr; binaryTreeNode* p = root; while (p != nullptr) { pp = p; if (e.first < p->element.first) { p = p->left; } else if (e.first > p->element.first) { p = p->right; } else { p->element.second = e.second; return; } } auto newNode = new binaryTreeNode(e); if (root != nullptr) { if (e.first < pp->element.first) { pp->left = newNode; } else if (e.first > pp->element.first) { pp->right = newNode; } } else { root = newNode; } treeSize++; } template void indexBinarySearchTree::erase(const K &e) { //这里用find不好,因为没法确定其父节点是哪个 binaryTreeNode* p = root; binaryTreeNode* pp = nullptr; bool isleft = false; while (p != nullptr && p->element.first != e) { pp = p; if (e < p->element.first) { p = p->left; isleft = true; } else if (e > p->element.first) { p = p->right; isleft = false; } } if (p == nullptr) return; //p-nochild if (p->left == nullptr && p->right == nullptr) { if (pp->left == p) pp->left = nullptr; else if (pp->right == p) pp->right = nullptr; treeSize--; delete p; } //p-child == 2 if (p->left != nullptr && p->right != nullptr) { pp = p->right; while (pp->left != nullptr) { pp = pp->left; } p->element = pp->element; treeSize--; delete pp; } //p-child == 1 if (p->right == nullptr) { isleft ? pp->left = p->left : pp->right = p->left; } if (p->left == nullptr) { isleft ? pp->left = p->right : pp->right = p->right; } } template void indexBinarySearchTree::ascent(){ inOrder(root); std::cout << ";" << std::endl; } #endif //INDEXBINARYSEARCHTREE_H