#include #include using namespace std;
static const bool red=true;
static const bool black=false;
//tree node
template class tnode;
template tnode::tnode()
template tnode::tnode(const type& key)
template int tnode::compare(const type& t);
template rbtree::rbtree()
template rbtree::~rbtree()
}template tnode* rbtree::min(tnode* x)
return x;
}template tnode* rbtree::max(tnode* x)
return x;
}template tnode* rbtree::successor(tnode* x)
tnode* y=x->p;
while(y!=nil && x==y->right)
return y;
}template tnode* rbtree::rb_search(const type& key)else if(result==1)else
} return p;
}template void rbtree::rb_insert(tnode* tnode)else
} tnode->p=y;
if(y==nil)else if(y->compare(tnode->key)==1)else
tnode->left=nil;
tnode->right=nil;
tnode->color=red;
rb_insert_fixup(tnode);
}template void rbtree::left_rotate(tnode* x)
y->p=x->p;
if(x->p==nil)elseelse
} y->left=x;
x->p=y;
}template void rbtree::right_rotate(tnode* x)
y->p=x->p;
if(y->p==nil)elseelse
} y->right=x;
x->p=y;
}template void rbtree::rb_insert_fixup(tnode* z)else if(z==z->p->right)else
}elseelse if(z==z->p->left)else
} }root->color=black;
}template tnode* rbtree::rb_delete(tnode* tnode)else
tnode* x;
if(y->left!=nil)else
x->p=y->p;
if(y->p==nil)elseelse
} if(y!=tnode)
if(y->color==black)
return y;
}template void rbtree::rb_delete_fixup(tnode* z)
if(w->left->color==black && w->right->color==black)else if(w->right->color==black)else
}else
if(w->left->color==black && w->right->color==black)else if(w->left->color==black)else
} }z->color=black;
}template void rbtree::freetree(tnode* node)
if(node->left!=nil)
if(node->right!=nil)
delete node;
node=null;
}template void rbtree::inorder(tnode* node,type a)
inorder(node->left,a);
a[count++]=node->key;
inorder(node->right,a);
}//*************myset**************************//
template class myset;
template myset::myset()
template myset::~myset()
}template bool myset::contains(const type& key)
return true;
}template bool myset::add(const type& key)
tnode* node=new tnode(key);
tree->rb_insert(node);
count++;
return true;
}template bool myset::remove(const type& key)
tnode* result=tree->rb_delete(node);
delete result;
count--;
return true;
}template bool myset::isempty()
template int myset::size()
template void myset::clear()
tree=new rbtree();
count=0;
}template type* myset::toarray(int& i)
#if 0
void main()
printf("倒序插入1000個數之後\n");
int count=0;
int* a=set->toarray(count);
printf("遍歷較小的十個數:\n");
for(int i=0;i<10;i++)
printf("\n");
set->remove(1);
printf("after remove 1.set.size()=%d\n",set->size());
set->clear();
printf("after clear.set.size()=%d\n",set->size());
delete set;
getchar();
}#endif
底層實現紅黑樹 Set原始碼解析(紅黑樹)
之前粗略看了一下list和map,今咱來聊一下set。主要看以下幾個 1 hashset 2 collections.synchronizedset 3 linkedhashset 4 copyonwritearrayset 5 treeset 一 hashset hashset是日常搬磚中最常用的...
STL中map和set底層的紅黑樹實現
我們都知道map和set的實現是依賴紅黑樹的 怎樣寫紅黑樹可以讓map和set都可以使用呢?在這裡我們定義了乙個模版引數,如果它是key那麼它就是set,如果它是map,那麼它就是map 我們分析一下,紅黑樹迭代器的前置 到當前結點,就說明了它的左子樹和自己都已經訪問過了 1,當前位置,若右樹不為空...
STL中map和set底層的紅黑樹實現
我們都知道map和set的實現是依賴紅黑樹的 怎樣寫紅黑樹可以讓map和set都可以使用呢?在這裡我們定義了乙個模版引數,如果它是key那麼它就是set,如果它是map,那麼它就是map 我們分析一下,紅黑樹迭代器的前置 到當前結點,就說明了它的左子樹和自己都已經訪問過了 1,當前位置,若右樹不為空...