Example #1
0
rb_node_t *RBTree::Insert(rb_node_t *z)
{
    rb_node_t *x = this->root;
    rb_node_t *y = &sentry;

    while(x != &sentry) {
        y = x;
        if (x->key < z->key)
            x = x->right;
        else if (x->key > z->key)
            x = x->left;
    }

    z->p = y;
    if (y == &sentry) {
        this->root = z;
    } else if (y->key > z->key) {
        y->left = z;
    } else {
        y->right = z;
    }

    z->left = z->right = &sentry;
    z->color = RED;

    InsertFixup(z);
    return z;
}
Example #2
0
void RbTree<Type>::Insert(const Type& nodevalue){
    TreeNodePointer newnode = new TreeNode<Type>();					//newnode定义为新插入的节点
    newnode->m_data = nodevalue;
    TreeNodePointer root = m_root;									//root主要负责进行遍历,辅助找到newnode的父亲节点
    TreeNodePointer newnodeparent = &m_nil;							//指向newnode的父亲节点
    while (root != &m_nil) {
		//根据比较结果,找到newnode应该插入的位置,最后root为nil,newparentnode指向newnode的父亲
        newnodeparent = root;
        if (nodevalue < root->m_data)
            root = root->m_left;
        else
            root = root->m_right;
    }
    newnode->m_parent = newnodeparent;								//设置newnode的父亲节点
    //根据父亲节点的类型,将newnode挂到父亲节点下,
	//如果为空则说明还没有节点,让跟节点直接指向新插入的节点
	//如果newnode的值比父亲节点小,根据rb性质,查到左子树。
	if (newnodeparent == &m_nil)
        m_root = newnode;
    else if (nodevalue < newnodeparent->m_data)
        newnodeparent->m_left = newnode;
    else
        newnodeparent->m_right = newnode;
	//设置newnode的左右子树,均为nil,并设置为RED
    newnode->m_left = &m_nil;
    newnode->m_right = &m_nil;
    newnode->m_color = RED;
#ifdef DEBUG
    std::cout << newnode->m_color << newnode->m_data <<m_root->m_data << std::endl;
#endif
	//进行颜色的调整
    InsertFixup(newnode);
    newnode = NULL;
}
void RBTree<T>::Insert(T *newNode)
{
	 T *pNode   = root;
	 T *parent  = NULL;
	
	while ( pNode != NULL) {
	    parent = pNode;
		if ( newNode->Prior(pNode) ) 
			pNode = pNode->left;
		else 
		    pNode = pNode->right;
		
	}
	if (parent == NULL) 
		root = newNode;
    else if (newNode->Prior(parent) )
		parent->left = newNode;
	else
		parent->right = newNode;

	newNode->parent = parent;

	InsertFixup(newNode);
}
/*
 *	Insert an element into the tree.
 */
rbnode_t *rbtree_insertnode(rbtree_t *tree, void *Data)
{
	rbnode_t *Current, *Parent, *X;

	/***********************************************
	 *  allocate node for Data and insert in tree  *
	 ***********************************************/

	/* find where node belongs */
	Current = tree->Root;
	Parent = NULL;
	while (Current != NIL) {
		int result;

		/*
		 *	See if two entries are identical.
		 */
		result = tree->Compare(Data, Current->Data);
		if (result == 0) {
			/*
			 *	Don't replace the entry.
			 */
			if (tree->replace_flag == 0) {
				return NULL;
			}

			/*
			 *	Do replace the entry.
			 */
			if (tree->freeNode) tree->freeNode(Current->Data);
			Current->Data = Data;
			return Current;
		}

		Parent = Current;
		Current = (result < 0) ? Current->Left : Current->Right;
	}

	/* setup new node */
	if ((X = malloc (sizeof(*X))) == NULL) {
		exit(1);	/* FIXME! */
	}

	X->Data = Data;
	X->Parent = Parent;
	X->Left = NIL;
	X->Right = NIL;
	X->Color = Red;

	/* insert node in tree */
	if (Parent) {
		if (tree->Compare(Data, Parent->Data) <= 0)
			Parent->Left = X;
		else
			Parent->Right = X;
	} else {
		tree->Root = X;
	}

	InsertFixup(tree, X);

	tree->num_elements++;

	return X;
}