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; }
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; }