完成bst的删除元素操作

This commit is contained in:
邹晓航
2014-10-18 09:04:31 +08:00
parent 14e01978af
commit b9ec71a519

View File

@@ -40,6 +40,7 @@ namespace TinySTL{
void insert(const T& val);
template<class Iterator>
void insert(Iterator first, Iterator last);
void erase(const T& val);
bool empty()const{ return root_ == 0; }
@@ -58,6 +59,7 @@ namespace TinySTL{
nodeAllocator::deallocate(ptr);
}
}
void erase_elem(const T& val, node *&ptr);
void insert_elem(const T& val, node *&ptr);
const_iterator find_min_aux(const node *ptr);
const_iterator find_max_aux(const node *ptr);
@@ -67,6 +69,33 @@ namespace TinySTL{
void print_postorder_aux(const string& delim, std::ostream& os, const node *ptr)const;
};//end of bst class
template<class T>
void binary_search_tree<T>::erase_elem(const T& val, node *&ptr){
if (ptr == 0)
return;
if (ptr->data_ != val){
if (val < ptr->data_)
erase_elem(val, ptr->left_);
else
erase_elem(val, ptr->right_);
}else{ // found
if (ptr->left_ != 0 && ptr->right_ != 0){// has two children
auto pos = const_cast<node *>(find_min_aux(ptr->right_).ptr_);
ptr->data_ = pos->data_;
erase_elem(pos->data_, ptr->right_);
}else{ //has one or no child
nodeAllocator::deallocate(ptr);
if (ptr->left_ == 0)
ptr = ptr->right_;
else
ptr = ptr->left_;
}
}
}
template<class T>
void binary_search_tree<T>::erase(const T& val){
erase_elem(val, root_);
}
template<class T>
void binary_search_tree<T>::insert_elem(const T& val, node *&ptr){//<2F>ظ<EFBFBD><D8B8><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD>
if (ptr == 0){
ptr = nodeAllocator::allocate();
@@ -171,6 +200,9 @@ namespace TinySTL{
//class of bst iterator
template<class T>//T = node
class bst_iter{
private:
template<class T>
friend class binary_search_tree;
private:
typedef typename binary_search_tree<typename T::value_type>::vaule_type value_type;
typedef typename binary_search_tree<typename T::value_type>::const_reference const_reference;
@@ -183,7 +215,20 @@ namespace TinySTL{
operator const T*(){ return ptr_; }
const_reference operator*(){ return ptr_->data_; }
const_pointer operator ->(){ return &(operator*()); }
public:
template<class T>
friend bool operator ==(const bst_iter<T>& it1, const bst_iter<T>& it2);
template<class T>
friend bool operator !=(const bst_iter<T>& it1, const bst_iter<T>& it2);
};
template<class T>
bool operator ==(const bst_iter<T>& it1, const bst_iter<T>& it2){
return it1.ptr_ == it2.ptr_;
}
template<class T>
bool operator !=(const bst_iter<T>& it1, const bst_iter<T>& it2){
return !(it1 == it2);
}
}
}