二叉搜索树是这样定义的: 左子树如果有,key值都比根节点的key值小, 右子树如果有,key值都比根节点的key值大, 左子树和右子树都是二叉搜索树; 模拟实现一个模板类BSTree.hpp实现搜索二叉树的一些基本功能
#pragma once #include<iostream> template<class K> struct BSTreeNode { BSTreeNode(const K& key) :_key(key), _left(NULL), _right(NULL){} K _key; BSTreeNode* _left; BSTreeNode* _right; }; template<class K> class BSTree { typedef BSTreeNode<K> Node; public: BSTree() :_root(NULL){} BSTree(const BSTree & t) { _copy(t._root); } void InOrder() { _InOrder(_root); std::cout << std::endl; } bool InsertR(const K& key)//递归 { return _InsertR(_root, key); } bool Insert(const K& key) { if (_root == NULL) { _root = new Node(key); } else { Node* parent = NULL; Node* root = _root; while (root) { parent = root; if (key > root->_key) root = root->_right; else if (key < root->_key) root = root->_left; else return false; } if (key < parent->_key) parent->_left = new Node(key); else parent->_right = new Node(key); } return true; } bool RemoveR(const K& key)//递归 { return _RemoveR(_root, key); } bool Remove(const K& key) { Node* parent = _root; Node* root = _root; while (root) { if (key > root->_key) { parent = root; root = root->_right; } else if (key < root->_key) { parent = root; root = root->_left; } else { break; } }//找到要删除的位置 Node* del = root; if (root == NULL) return false;//没找到位置 if (root->_left == NULL) { if (root == _root) _root = _root->_right; else { if (root == parent->_right) parent->_right = root->_right;//要删除的点左边没东西,让父节点指向它的右节点即可; else parent->_left = root->_left; } } else if (root->_right == NULL) { if (root == _root) _root = _root->_left; else { if (root == parent->_right) parent->_right = root->_right; else parent->_left = root->_left; } } else { Node* rootL = root->_left; parent = root; while (rootL->_right)//左右两边都有节点,找左边最大的节点 { parent = rootL; rootL = rootL->_right; } root->_key = rootL->_key; del = rootL; if (root == parent->_right) parent->_right = rootL->_left; else parent->_left = rootL->_left; } delete del; del = NULL; return true; } Node* FindR(const K& key) { return _FindR(_root, key); } Node* Find(const K& key) { Node* root = _root; while (root) { if (key > root->_key) root = root->_right; else if (key < root->_key) root = root->_left; else return root; } return root; } ~BSTree() { _delete(_root); } private: Node* _FindR(Node* root, const K& key) { if (root == NULL) return NULL; if (key > root->_key) return _FindR(root->_right, key); else if (key < root->_key) return _FindR(root->_left, key); else return root; } bool _RemoveR(Node* &root, const K& key) { if (root == NULL) return false; if (key > root->_key) return _RemoveR(root->_right, key); else if (key < root->_key) return _RemoveR(root->_left, key); else { Node* del = root; if (root->_left == NULL) { root = root->_right; } else if (root->_right == NULL) { root = root->_left; } else { Node* parent = root; Node* left = root->_left; while (left->_right) { parent = left; left = left->_right; } del = left; root->_key = left->_key; if (left == parent->_right) parent->_right = left->_left; else parent->_left = left->_left; } delete del; } return true; } bool _InsertR(Node*& root, const K& key) { if (root == NULL) root = new Node(key); if (key > root->_key) return _InsertR(root->_right, key); else if (key < root->_key) return _InsertR(root->_left, key); else return false; } void _InOrder(Node* root) { if (root) { _InOrder(root->_left); std::cout << root->_key << " "; _InOrder(root->_right); } } void _copy(Node* root) { if (root == NULL) return; Node *_root = new Node(root->_key); _root->_left = NULL; _root->_right = NULL; if (root->_left) _copy(root->_left); if (root->_right) _copy(root->_right); } void _delete(Node*& root) { if (root != NULL) { _delete(root->_left); _delete(root->_right); delete root; root = NULL; } } protected: Node* _root; };