紅黑樹C C 實現 附帶乙個set容器

2021-06-14 12:35:57 字數 3334 閱讀 8696

#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,當前位置,若右樹不為空...