erase bug fix

This commit is contained in:
邹晓航
2015-01-15 12:00:07 +08:00
parent ca373d2e87
commit b2aaf677b1

View File

@@ -108,27 +108,26 @@ namespace TinySTL{
void avl_tree<T>::erase_elem(const T& val, node *&p){ void avl_tree<T>::erase_elem(const T& val, node *&p){
if (p == 0) if (p == 0)
return; return;
if (p->data_ < val){ if (p->data_ != val){
erase_elem(val, p->right_); if (val < p->data_)
} return erase_elem(val, p->left_);
else if (p->data_ > val){ else
erase_elem(val, p->left_); return erase_elem(val, p->right_);
} }else{ // found
else{// found if (p->left_ != 0 && p->right_ != 0){// has two children
if (p->left_ != 0 && p->right_ != 0){//has two children
size_t choose = size_ % 2; size_t choose = size_ % 2;
//<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ʹ<EFBFBD><CAB9>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD> //<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ʹ<EFBFBD><CAB9>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
auto pos = (choose == 0 ? auto pos = (choose == 0 ?
const_cast<node *>(find_min_aux(p->right_).ptr_) : const_cast<node *>(find_max_aux(p->left_).ptr_)); const_cast<node *>(find_min_aux(p->right_).ptr_) : const_cast<node *>(find_max_aux(p->left_).ptr_));
p->data_ = pos->data_; p->data_ = pos->data_;
(choose == 0 ? erase_elem(pos->data_, p->right_) : erase_elem(pos->data_, p->left_)); return (choose == 0 ? erase_elem(pos->data_, p->right_) : erase_elem(pos->data_, p->left_));
} }else{ //has one or no child
else{ //has one or no child
auto temp = p; auto temp = p;
if (p->left_ == 0) if (p->left_ == 0)
p = p->right_; p = p->right_;
else else
p = p->left_; p = p->left_;
dataAllocator::destroy(temp);
dataAllocator::deallocate(temp); dataAllocator::deallocate(temp);
--size_; --size_;
} }
@@ -140,8 +139,7 @@ namespace TinySTL{
singleLeftLeftRotate(p); singleLeftLeftRotate(p);
else else
doubleLeftRightRotate(p); doubleLeftRightRotate(p);
} }else if (getHeight(p->right_) - getHeight(p->left_) == 2){
else if (getHeight(p->right_) - getHeight(p->left_) == 2){
if (p->right_->left_ == 0) if (p->right_->left_ == 0)
singleRightRightRotate(p); singleRightRightRotate(p);
else else