示例#1
0
void rbtree_insert(volatile rbtree_t *tree,rbtree_node_t *node){
	rbtree_node_t **root,*temp,*sentinel;

	root = (rbtree_node_t **)&tree -> root;
	sentinel = tree -> sentinel;
	if(*root == sentinel){
		node -> parent = NULL;
		node -> left = sentinel;
		node -> right = sentinel;
		rbt_black(node);
		*root = node;
		return;
	}
	tree -> insert(*root,node,sentinel);
	/*re_balance tree*/
	while(node != *root && rbt_is_red(node -> parent)){
		if(node -> parent == node -> parent -> parent -> left){
			temp = node -> parent -> parent -> right;
			if(rbt_is_red(temp)){
				rbt_black(node -> parent);
				rbt_black(temp);
				rbt_red(node -> parent -> parent);
				node = node -> parent -> parent;
			}else{
				if(node == node -> parent -> right){
					node = node -> parent;
					rbtree_left_rotate(root,sentinel,node);
				}
				rbt_black(node -> parent);
				rbt_red(node -> parent -> parent);
				rbtree_right_rotate(root,sentinel,node -> parent -> parent);
			}
		}else{
			temp = node -> parent -> parent -> left;
			if(rbt_is_red(temp)){
				rbt_black(node -> parent);
				rbt_black(temp);
				rbt_red(node -> parent -> parent);
				node = node -> parent -> parent;
			}else{
				if(node == node -> parent -> left){
					node = node -> parent;
					rbtree_right_rotate(root,sentinel,node);
				}
				rbt_black(node -> parent);
				rbt_red(node -> parent -> parent);
				rbtree_left_rotate(root,sentinel,node -> parent -> parent);
			}
		}
	}
	rbt_black(*root);
}
示例#2
0
void rbtree_init(ezRBTree *tree, ezRBTreeNode *sentinel, rbTreeNodeCompare node_cmp_proc)
{
    /* a sentinel must be black */
    rbt_black(sentinel);
    sentinel->parent = NULL;
    sentinel->left = NULL;
    sentinel->right = NULL;

    tree->root = sentinel;
    tree->sentinel = sentinel;
    tree->node_cmp_proc = node_cmp_proc;
}
示例#3
0
文件: rbtree.c 项目: lchb369/appnet
void
rbtree_delete( rbtree_t *tree , rbtree_node_t *node )
{
	uint_t red;
	rbtree_node_t **root,*sentinel,*subst,*temp,*w;
	
	/* a binary tree delete */

	root = (rbtree_node_t **) &tree->root;
	sentinel = tree->sentinel;
	
	if (node->left == sentinel)
	{
		temp = node->right;
		subst = node;
		
	}
	else if (node->right == sentinel)
	{
		temp = node->left;
		subst = node;
		
	}
	else
	{
		subst = rbtree_min( node->right , sentinel );
		
		if (subst->left != sentinel)
		{
			temp = subst->left;
		}
		else
		{
			temp = subst->right;
		}
	}
	
	if (subst == *root)
	{
		*root = temp;
		rbt_black( temp );
		
		/* DEBUG stuff */
		node->left = NULL;
		node->right = NULL;
		node->parent = NULL;
		node->key = 0;
		
		return;
	}
	
	red = rbt_is_red(subst);
	
	if (subst == subst->parent->left)
	{
		subst->parent->left = temp;
		
	}
	else
	{
		subst->parent->right = temp;
	}
	
	if (subst == node)
	{
		
		temp->parent = subst->parent;
		
	}
	else
	{
		
		if (subst->parent == node)
		{
			temp->parent = subst;
			
		}
		else
		{
			temp->parent = subst->parent;
		}
		
		subst->left = node->left;
		subst->right = node->right;
		subst->parent = node->parent;
		rbt_copy_color( subst , node );
		
		if (node == *root)
		{
			*root = subst;
			
		}
		else
		{
			if (node == node->parent->left)
			{
				node->parent->left = subst;
			}
			else
			{
				node->parent->right = subst;
			}
		}
		
		if (subst->left != sentinel)
		{
			subst->left->parent = subst;
		}
		
		if (subst->right != sentinel)
		{
			subst->right->parent = subst;
		}
	}
	
	/* DEBUG stuff */
	node->left = NULL;
	node->right = NULL;
	node->parent = NULL;
	node->key = 0;
	
	if (red)
	{
		return;
	}
	
	/* a delete fixup */

	while (temp != *root && rbt_is_black(temp) )
			{
		
		if (temp == temp->parent->left)
		{
			w = temp->parent->right;
			
			if (rbt_is_red(w) )
					{
				rbt_black( w );
				rbt_red( temp->parent );
				rbtree_left_rotate( root , sentinel , temp->parent );
				w = temp->parent->right;
			}
			
			if (rbt_is_black(w->left) && rbt_is_black(w->right) )
					{
				rbt_red( w );
				temp = temp->parent;
				
			}
			else
			{
				if (rbt_is_black(w->right) )
						{
					rbt_black( w->left );
					rbt_red( w );
					rbtree_right_rotate( root , sentinel , w );
					w = temp->parent->right;
				}
				
				rbt_copy_color( w , temp->parent );
				rbt_black( temp->parent );
				rbt_black( w->right );
				rbtree_left_rotate( root , sentinel , temp->parent );
				temp = *root;
			}
			
		}
		else
		{
			w = temp->parent->left;
			
			if (rbt_is_red(w) )
					{
				rbt_black( w );
				rbt_red( temp->parent );
				rbtree_right_rotate( root , sentinel , temp->parent );
				w = temp->parent->left;
			}
			
			if (rbt_is_black(w->left) && rbt_is_black(w->right) )
					{
				rbt_red( w );
				temp = temp->parent;
				
			}
			else
			{
				if (rbt_is_black(w->left) )
						{
					rbt_black( w->right );
					rbt_red( w );
					rbtree_left_rotate( root , sentinel , w );
					w = temp->parent->left;
				}
				
				rbt_copy_color( w , temp->parent );
				rbt_black( temp->parent );
				rbt_black( w->left );
				rbtree_right_rotate( root , sentinel , temp->parent );
				temp = *root;
			}
		}
	}

	rbt_black( temp );
}
示例#4
0
#include "dryad_rbt.h"

_(logic \bool mutable_rbt(RBTNode * x) = x != NULL ==> \mutable(x) && \writable(x))

_(dryad)
int rbt_find_smallest(RBTNode * x)
	_(requires x != NULL && rbt(x))
	_(ensures x != NULL && rbt(x))
	_(ensures rbt_reach(x) == \old(rbt_reach(x)))
	_(ensures rbt_keys(x) == \old(rbt_keys(x)))
	_(ensures rbt_bh(x) == \old(rbt_bh(x)))
	_(ensures rbt_black(x) == \old(rbt_black(x)))
	_(ensures \intset_in(\result, rbt_keys(x)))
  _(ensures \intset_le_one1(\result, rbt_keys(x)))
{
	_(assume mutable_rbt(x))
	
	if (x->left == NULL) {
		return x->key;
	} else {
		int r = rbt_find_smallest(x->left);
		return r;
	}
}

示例#5
0
void rbtree_insert(ezRBTree *tree, ezRBTreeNode *node) {
    ezRBTreeNode **root, *temp, *sentinel;

    /* a binary tree insert */
    root = (ezRBTreeNode **) &tree->root;
    sentinel = tree->sentinel;

    if (*root == sentinel) {
        node->parent = NULL;
        node->left = sentinel;
        node->right = sentinel;
        rbt_black(node);
        *root = node;

        return;
    }

    default_rbtree_insert_value(tree, *root, node, sentinel);

    /* re-balance tree */
    while (node != *root && rbt_is_red(node->parent)) {

        if (node->parent == node->parent->parent->left) {
            temp = node->parent->parent->right;

            if (rbt_is_red(temp)) {
                rbt_black(node->parent);
                rbt_black(temp);
                rbt_red(node->parent->parent);
                node = node->parent->parent;

            } else {
                if (node == node->parent->right) {
                    node = node->parent;
                    rbtree_left_rotate(root, sentinel, node);
                }

                rbt_black(node->parent);
                rbt_red(node->parent->parent);
                rbtree_right_rotate(root, sentinel, node->parent->parent);
            }

        } else {
            temp = node->parent->parent->left;

            if (rbt_is_red(temp)) {
                rbt_black(node->parent);
                rbt_black(temp);
                rbt_red(node->parent->parent);
                node = node->parent->parent;

            } else {
                if (node == node->parent->left) {
                    node = node->parent;
                    rbtree_right_rotate(root, sentinel, node);
                }

                rbt_black(node->parent);
                rbt_red(node->parent->parent);
                rbtree_left_rotate(root, sentinel, node->parent->parent);
            }
        }
    }

    rbt_black(*root);
}