二叉查找树: 定义为任何父亲节点数据的大小都大于左子女, 小于右子女。 这样, 中序遍历树即可拿到树的一个排序。插入节点的过程就是建树的过程。 为了使树的结构能更趋于平衡, 在插入前, 将序列随机化是一个非常不错的办法。 主要实现了insert, delete, maxmum, minimum, next, previous方法, 以下是我的实现.
用节点作树的存储结构:其中TreeNode是节点结构。
template<class Ty>
class BinarySearchTree
{
public:
typedef Ty value_type;
typedef Ty* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
template<class Ty>
class TreeNode
{
public:
typedef Ty value_type;
TreeNode() : m_parent(0), m_left(0), m_right(0) {}
TreeNode(const Ty& __x) : m_parent(0), m_left(0), m_right(0), m_value(__x) {}
Ty m_value;
TreeNode<Ty>* m_parent;
TreeNode<Ty>* m_left;
TreeNode<Ty>* m_right;
TreeNode<Ty>* left() {
return m_left;
}
TreeNode<Ty>* right() {
return m_right;
}
TreeNode<Ty>* parent() {
return m_parent;
}
Ty& value() {
return m_value;
}
static TreeNode<Ty>* makeNode(const Ty& __x)
{
return new TreeNode<Ty>(__x);
}
};
typedef TreeNode<Ty> node_type;
public:
BinarySearchTree() : m_root(0) {}
~BinarySearchTree()
{
destroy();
}
void insert(const value_type& __x)
{
node_type* curNode = m_root;
node_type* node = TreeNode<Ty>::makeNode(__x);
if (!m_root)
{
m_root = node;
return;
}
while(curNode)
{
if (m_function(node->value(), curNode->value()))
{
if (curNode->left())
{
curNode = curNode->left();
}
else
{
curNode->m_left = node;
node->m_parent = curNode;
return;
}
}
else
{
if (curNode->right())
{
curNode = curNode->right();
}
else
{
curNode->m_right = node;
node->m_parent = curNode;
return;
}
}
}
}
template<class Function>
void traverse(Function f)
{
traverse(m_root, f);
}
template<class Function>
void traverse(node_type* root, Function f)
{
if (!root)
return;
traverse(root->left(), f);
traverse(root->right(), f);
f(root->value());
}
value_type minimum()
{
node_type* node = m_root;
if (!node)
{
throw std::out_of_range(“no minimum”);
}
while(node->left())
{
node = node->left();
}
return node->value();
}
value_type maxmum()
{
node_type* node = m_root;
if (!node)
{
throw std::out_of_range(“no minimum”);
}
while(node->right())
{
node = node->right();
}
return node->value();
}
node_type* next(node_type* node)
{
assert(node);
if (!node) return 0;
if (node->right())
{
return minimum(node->right());
}
while(node->parent() && node->parent()->right() == node)
{
node = node->parent();
}
return node->parent();
}
node_type* privious(node_type* node)
{
assert(node);
if (!node) return 0;
if (node->left())
{
return maxmum(node->left());
}
while(node->parent() && node->parent()->left() == node)
{
node = node->parent();
}
return node->parent();
}
node_type* find(const value_type& __x)
{
node_type* node = m_root;
while(node)
{
if (node->value() == __x)
{
return node;
}
if (m_function(node->value(), __x))
{
node = node->right();
}
else
{
node = node->left();
}
}
return 0;
}
void erase(const value_type& __x)
{
node_type* node = find(__x);
if (!node)
{
return;
}
if (!node->left() || !node->right())
{
}
else
{
node_type* nextNode = next(node);
std::swap(node->m_value, nextNode->m_value);
node = nextNode;
}
node_type** parent;
if (!node->parent())
{
parent = &m_root;
}
else
{
if (node->parent()->left() == node)
{
parent = &(node->m_parent->m_left);
}
else
{
parent = &(node->m_parent->m_right);
}
}
if (node->left())
{
*parent = node->left();
node->m_left->m_parent = node->parent() ? node->parent() : 0;
}
else
{
*parent = node->right();
if (node->right())
node->m_right->m_parent = node->parent() ? node->parent() : 0;
}
delete node;
}
private:
node_type* minimum(node_type* node)
{
assert(node);
while(node->left())
{
node = node->left();
}
return node;
}
node_type* maxmum(node_type* node)
{
assert(node);
while(node->right())
{
node = node->right();
}
return node;
}
private:
BinarySearchTree(const BinarySearchTree&);
BinarySearchTree& operator= (const BinarySearchTree&);
void destroy()
{
removeTree(m_root);
m_root = 0;
}
void removeTree(node_type* root)
{
if (root)
{
removeTree(root->left());
removeTree(root->right());
delete root;
}
}
std::less<Ty> m_function;
node_type* m_root;
};