void cs_pqueue_delete(cs_pqueue_t* q, cs_pqnode_t* node) { if (!node->left) { _transplant(q, node, node->right); } else if (!node->right) { _transplant(q, node, node->left); } else { cs_pqnode_t* tmp = _minimum_node(node->right); if (tmp->parent != node) { _transplant(q, tmp, tmp->right); tmp->right = node->right; tmp->right->parent = tmp; } _transplant(q, node, tmp); tmp->left = node->left; tmp->left->parent = tmp; } if (q->mode == CS_PQ_LOWEST_PRIORITY) { q->lowest = _cs_pqueue_minimum(q); } else { q->highest = _cs_pqueue_maximum(q); } free(node); }
//删除,有待完成 void RBTree::deleteData(T data) { //查找节点 Node *node = tree_search(data); if (!node) { printf("没有找到数据为%d的节点\n",data); return; } if (!node->left) { _transplant(node,node->right); } else if (!node->right) { _transplant(node,node->left); } else { Node *y = _min_Mun(node->right); if (y->parent != node) { _transplant(y,y->right); y->right = node->right; y->right->parent = y; } _transplant(node,y); y->left = node->left; y->left->parent = y; } free(node); node->left = NULL; node->right = NULL; node->parent = NULL; node = NULL; }