- 二叉搜索树的查找效率:
最优情况下,二叉搜索树为完全二叉树时,效率为logN;
最坏情况下,二叉搜索树为单支树,效率为N/2。 - 定义结点:
template <class T>
struct BSTNode
{
BSTNode(const T& kv = T())
:_left(nullptr)
, _right(nullptr)
, _kv(kv)
{}
BSTNode<T>* _left;
BSTNode<T>* _right;
T _kv;
};
class BSTree
{
typedef BSTNode<T> Node;
typedef Node* pNode;
public:
BSTree()
:root(nullptr)
{}
~BSTree()
{
_Destroy(root);
}
private:
void _Destroy(pNode& root)
{
if(root)
{
_Destroy(root->_left);
_Destroy(root->_right);
root = nullptr;
}
}
pNode root;
}
Node* Copy(Node* root)
{
if(root == nullptr)
return nullptr;
Node* newroot = new Node(root->_kv);
newroot->_left = Copy(root->_left);
newroot->_right = Copy(root->_right);
return newroot;
}
BSTree(const BSTree<T>& tree)
{
root = Copy(tree->root);
}
BSTree<T>& operator = (const BSTree<T>& tree)
{
if (this != &tree)
{
_Destroy(this->root);
this->root = Copy(tree->root);
return *this;
}
}
BSTree<T>& operator = (const BSTree<T>& tree)
{
swap(this->root, tree->root);
return *this;
}
bool Insert(const T& kv)
{
if (root == nullptr)
{
root = new Node(kv);
return true;
}
Node* cur = root;
Node* parent = nullptr;
while (cur)
{
parent = cur;
if (kv < cur->_kv)
cur = cur->_left;
else if (kv > cur->_kv)
cur = cur->_right;
else
return false;
}
cur = new Node(kv);
if (kv < parent->_kv)
parent->_left = cur;
else
parent->_right = cur;
return true;
}
void _inorder(Node* root)
{
if (root == nullptr)
return;
_inorder(root->_left);
cout << root->_kv << " ";
_inorder(root->_right);
cout << endl;
}
void Print()
{
_inorder(root);
}
bool Erase(const T& kv)
{
if (root == nullptr)
return false;
Node* cur = root;
Node* parent = nullptr;
while(cur)
{
if (cur->_kv == kv)
{
break;
}
else if (kv < cur->_kv)
{
parent = cur;
cur = cur->_left;
}
else
{
parent = cur;
cur = cur->_right;
}
}
if (cur == nullptr)
return false;
if (cur->_left == nullptr)
{
if (cur == root)
root = cur->_right;
else
{
if (cur == parent->_left)
parent->_left = cur->_right;
else
parent->_right = cur->_right;
}
delete cur;
}
else if (cur->_right == nullptr)
{
if (cur == nullptr)
root = cur->_left;
else
{
if (cur == parent->_left)
parent->_left = cur->_left;
else
parent->_right = cur->_left;
}
delete cur;
}
else
{
Node* replace = cur->_right;
Node* preplace = nullptr;
while (replace->_left)
{
preplace = replace;
replace = replace->_left;
}
cur->_kv = replace->_kv;
if (replace == preplace->_left)
preplace->_left = nullptr;
else
preplace->_right = nullptr;
delete replace;
replace = nullptr;
}
return true;
}
Node* Find(const T& kv)
{
Node* cur = root;
while (cur)
{
if (kv == cur->_kv)
return cur;
else if (kv < cur->_kv)
cur = cur->_left;
else
cur = cur->_right;
}
return nullptr;
}