和算法导论上说明的一样,主要是实现下,给自己留着备用。
struct Tree
{
int value;
Tree* l_child;
Tree* r_child;
Tree* parent;
};
void deleteNode(Tree * tree, Tree* node)
{
Tree* temp = node->parent;
if (node->l_child)
{
if (node->r_child)
{
Tree* temp_node = searchMin(temp->r_child);
deleteNode(temp, node, temp_node);
temp_node->l_child = node->l_child;
}
else
{
deleteNode(temp, node, node->l_child);
}
}
else if(node->r_child)
{
Tree* temp_node = searchMin(temp->r_child);
deleteNode(temp, node, temp_node);
}
else
{
replace(temp, node);
}
}
void deleteNode(Tree* parent, Tree* delete_tree, Tree* replace_node)
{
if (replace_node)
{
if (replace_node->parent)//replace为最小元素,肯定无左孩子
{
replace_node->parent->l_child = replace_node->r_child;
}
if (replace_node->r_child)
{
replace_node->r_child->parent = replace_node->parent;
}
}
//处理删除节点
replace(parent, delete_tree, replace_node);
}
void replace(Tree* parent, Tree* delete_tree, Tree* node = NULL)
{
if (parent->l_child == delete_tree)
{
parent->l_child = node;
}
else
{
parent->r_child = node;
}
if (node)
{
node->parent = parent;
}
}
Tree* searchMin(Tree* node)
{
if (node == NULL)
{
return node;
}
Tree* ptr = node;
while (ptr->l_child != NULL)
{
ptr = ptr->l_child;
}
return ptr;
}
void pushNode(Tree* tree, Tree* z)
{
Tree *parent = NULL, *current = tree;
while (current != NULL)
{
parent = current;
if (current->value < z->value)
{
current = current->r_child;
}
else
{
current = current->l_child;
}
}
if (parent == NULL)
{
tree = z;
}
else
{
if (parent->value < z->value)
{
parent->r_child = z;
}
else
{
parent->l_child = z;
}
z->parent = parent;
}
}