#pragma once #include #include #include namespace Lenyiin { template struct BSTreeNode { BSTreeNode(const K &key = K(), const V &value = V()) : _key(key), _value(value), _left(nullptr), _right(nullptr) { } K _key; V _value; BSTreeNode *_left; BSTreeNode *_right; }; template class BSTree { private: typedef BSTreeNode Node; Node *_Copy(Node *root) { if (root == nullptr) { return nullptr; } Node *cur = new Node(root->_key, root->_value); cur->_left = _Copy(root->_left); cur->_right = _Copy(root->_right); return cur; } public: // 默认构造 BSTree() : _root(nullptr) { } // 拷贝构造 BSTree(const BSTree &tree) { _root = _Copy(tree._root); } // 非递归插入 // bool Insert(const K& key, const V& value) //{ // // 如果根为空, 直接插入 // if (_root == nullptr) // { // _root = new Node(key, value); // return true; // } // // 如果根不为空, 找到插入位置 // Node* parent = nullptr; // Node* cur = _root; // while (cur) // { // if (cur->_key > key) // { // parent = cur; // cur = cur->_left; // } // else if (cur->_key < key) // { // parent = cur; // cur = cur->_right; // } // else // { // return false; // 如果相等, 表示我已经有了, 不需要插入了 // } // } // // 插入节点 // cur = new Node(key, value); // if (parent->_key > key) // { // parent->_left = cur; // } // else // { // parent->_right = cur; // } // return true; //} // 递归插入 // 辅助函数 Node *_insert(Node *root, const K &key, const V &value) { if (root == nullptr) { return new Node(key, value); } if (key < root->_key) { root->_left = _insert(root->_left, key, value); } else if (key > root->_key) { root->_right = _insert(root->_right, key, value); } return root; } // 插入 void Insert(const K &key, const V &value) { _root = _insert(_root, key, value); } // 非递归查找节点 // Node* Find(const K& key) //{ // Node* cur = _root; // while (cur) // { // if (cur->_key > key) // { // cur = cur->_left; // } // else if (cur->_key < key) // { // cur = cur->_right; // } // else // { // return cur; // } // } // return nullptr; //} // 递归查找节点 // 辅助函数 Node *_find(Node *root, const K &key) { if (root == nullptr || root->_key == key) { return root; } if (key < root->_key) { return _find(root->_left, key); } else { return _find(root->_right, key); } } // 查找节点 Node *Find(const K &key) { return _find(_root, key); } // 非递归删除节点 // bool Erase(const K& key) //{ // // 找到要删除的节点 // Node* parent = nullptr; // Node* cur = _root; // while (cur) // { // if (cur->_key > key) // { // parent = cur; // cur = cur->_left; // } // else if (cur->_key < key) // { // parent = cur; // cur = cur->_right; // } // else // { // break; // } // } // // 没找到 // if (cur == nullptr) // { // return false; // } // // 找到了 // // 1. 要删除的节点没有左孩子 // if (cur->_left == nullptr) // { // if (cur == _root) // { // _root = cur->_right; // } // else // { // if (parent->_left == cur) // { // parent->_left = cur->_right; // } // else // { // parent->_right = cur->_right; // } // } // delete cur; // } // // 2. 要删除的节点没有右孩子 // else if (cur->_right == nullptr) // { // if (cur == _root) // { // _root = cur->_left; // } // else // { // if (parent->_left == cur) // { // parent->_left = cur->_left; // } // else // { // parent->_right = cur->_left; // } // } // delete cur; // } // // 3. 左右都不为空, 不能直接删除, 使用替换法删除 // // 可以找左子树的最大节点或者右子树的最小节点去替代它 // else // { // // 右子树最小节点 // Node* rightMinParent = cur; // Node* rightMin = cur->_right; // while (rightMin->_left) // { // rightMinParent = rightMin; // rightMin = rightMin->_left; // } // // 替换删除的节点 // std::swap(cur->_key, rightMin->_key); // std::swap(cur->_value, rightMin->_value); // // 把问题转换成删除 rightMin // if (rightMinParent->_left == rightMin) // { // rightMinParent->_left = rightMin->_right; // } // else // { // rightMinParent->_right = rightMin->_right; // } // delete rightMin; // } // return true; //} // 递归删除节点 // 辅助函数 Node *_erase(Node *root, const K &key) { if (root == nullptr) { return root; } if (key < root->_key) { root->_left = _erase(root->_left, key); } else if (key > root->_key) { root->_right = _erase(root->_right, key); } else { if (root->_left == nullptr) { Node *ret = root->_right; delete root; return ret; } if (root->_right == nullptr) { Node *ret = root->_left; delete root; return ret; } Node *minNode = getMin(root->_right); root->_key = minNode->_key; root->_right = _erase(root->_right, minNode->_key); } return root; } Node *getMin(Node *node) { while (node->_left != nullptr) { node = node->_left; } return node; } // 删除节点 void Erase(const K &key) { _erase(_root, key); } // 递归中序遍历 // 辅助函数 // void _InOrder(Node* root) //{ // if (root == nullptr) // { // return; // } // _InOrder(root->_left); // //std::cout << root->_key << " : " << root->_value << std::endl; // std::cout << root->_key << " "; // _InOrder(root->_right); //} // void InOrder() //{ // _InOrder(_root); // std::cout << std::endl; // } // 非递归中序遍历 void InOrder() { std::stack stack; Node *cur = _root; while (cur != nullptr || !stack.empty()) { // 找到最左边的节点 while (cur != nullptr) { stack.push(cur); cur = cur->_left; } // 处理当前节点 cur = stack.top(); stack.pop(); std::cout << cur->_key << " "; // 转向右子树 cur = cur->_right; } std::cout << std::endl; } // 递归前序遍历 // 辅助函数 // void _PreOrder(Node* root) //{ // if (root == nullptr) // { // return; // } // std::cout << root->_key << " "; // 访问根节点 // _PreOrder(root->_left); // 访问左子树 // _PreOrder(root->_right); // 访问右子树 //} // void PreOrder() //{ // _PreOrder(_root); // std::cout << std::endl; // } // 非递归前序遍历 void PreOrder() { if (_root == nullptr) { return; } std::stack stack; stack.push(_root); while (!stack.empty()) { Node *cur = stack.top(); stack.pop(); std::cout << cur->_key << " "; // 访问当前节点 // 先压入右子树再压入左子树(确保左子树先处理) if (cur->_right != nullptr) { stack.push(cur->_right); } if (cur->_left != nullptr) { stack.push(cur->_left); } } std::cout << std::endl; } // 递归后序遍历 // 辅助函数 // void _PostOrder(Node* root) { // if (root == nullptr) // { // return; // } // _PostOrder(root->_left); // 访问左子树 // _PostOrder(root->_right); // 访问右子树 // std::cout << root->_key << " "; // 访问根节点 //} // void PostOrder() //{ // _PostOrder(_root); // std::cout << std::endl; // } // 非递归后序遍历 void PostOrder() { if (_root == nullptr) { return; } std::stack st; Node *cur = _root; Node *lastNode = nullptr; // 最近访问的节点 while (cur || !st.empty()) { while (cur) { st.push(cur); cur = cur->_left; } Node *top = st.top(); if ((top->_right == nullptr) || (lastNode == top->_right)) { std::cout << top->_key << " "; lastNode = top; st.pop(); } else { cur = top->_right; } } std::cout << std::endl; } // 层序遍历 void LevelOrder() { if (_root == nullptr) { return; } std::queue queue; queue.push(_root); while (!queue.empty()) { Node *cur = queue.front(); queue.pop(); std::cout << cur->_key << " "; // 访问当前节点 if (cur->_left != nullptr) { queue.push(cur->_left); // 将左子树压入队列 } if (cur->_right != nullptr) { queue.push(cur->_right); // 将右子树压入队列 } } std::cout << std::endl; } // 查找前驱节点 Node *findMax(Node *node) { while (node->_right != nullptr) { node = node->_right; } return node; } Node *FindPredecessor(Node *node) { if (node->_left != nullptr) { return findMax(node->_left); } Node *cur = _root; Node *predecessor = nullptr; while (cur != nullptr) { if (node->_key < cur->_key) { cur = cur->_left; } else if (node->_key > cur->_key) { predecessor = cur; cur = cur->_right; } else { break; } } return predecessor; } // 查找后继节点 Node *findMin(Node *node) { while (node->_left != nullptr) { node = node->_left; } return node; } Node *FindSuccessor(Node *node) { if (node->_right != nullptr) { return findMin(node->_right); } Node *cur = _root; Node *successor = nullptr; while (cur != nullptr) { if (node->_key < cur->_key) { successor = cur; cur = cur->_left; } else if (node->_key > cur->_key) { cur = cur->_right; } else { break; } } return successor; } private: Node *_root = nullptr; }; }