void BST<Item, Key>::remove_max_node(Node*& ptr, Item& data) { if (ptr->right == NULL) { Node* temp = ptr; data = ptr->data; ptr = ptr->left; delete temp; } else { remove_max_node(ptr->right, data); } }
PB_DS_CLASS_T_DEC void PB_DS_CLASS_C_DEC:: pop() { PB_DS_ASSERT_VALID((*this)) _GLIBCXX_DEBUG_ASSERT(!base_type::empty()); _GLIBCXX_DEBUG_ASSERT(m_p_max != 0); node_pointer p_nd = m_p_max; remove_max_node(); base_type::actual_erase_node(p_nd); PB_DS_ASSERT_VALID((*this)) }
bool BST<Item, Key>::remove_node(Node*& ptr, const Key& key) { if (ptr == NULL) { return false; } if (key < ptr->data) { return remove_node(ptr->left, key); } else if (key > ptr->data) { return remove_node(ptr->right, key); } else { if (ptr->left == NULL) { Node* temp = ptr; ptr = ptr->right; delete temp; } else { remove_max_node(ptr->left, ptr->data); } } return true; }
PB_DS_CLASS_T_DEC inline void PB_DS_CLASS_C_DEC:: remove_node(node_pointer p_nd) { node_pointer p_parent = p_nd; while (base_type::parent(p_parent) != 0) p_parent = base_type::parent(p_parent); base_type::bubble_to_top(p_nd); m_p_max = p_nd; node_pointer p_fix = base_type::m_p_root; while (p_fix != 0&& p_fix->m_p_next_sibling != p_parent) p_fix = p_fix->m_p_next_sibling; if (p_fix != 0) p_fix->m_p_next_sibling = p_nd; remove_max_node(); }