我编写了一个代码,在查看我的学习手册之前从二叉树中删除了一个节点。这是:
int max (num*& node) {
if (node->right != 0) max (node->right);
else {
num* temp = node;
node = node->left;
return temp->n;
delete temp;
}
}
void remove (num*& node, int k) {
if (node == 0) {return;}
if (k == node->n){
if (node->left == 0){
num* newleaf = node;
node = node->right;
delete newleaf;
}
else if (node->right == 0){
num* newleaf = node;
node = node->left;
delete newleaf;
}
else {
node->n = max (node->left);
}}
if (k < node->n) {remove (node->left, k);}
if (k > node->n) {remove (node->right, k);}
}
因此,我们所做的是将目标节点的值分配给左侧部分中的最大节点的值,而不使用实际删除目标节点。然后我们删除那个最大节点。 显然,它工作正常,我用不同的情况检查了它。 但后来我看了看我的书并发现了一种不同的方法:
node* find_max (node* p_tree)
{
if ( p_tree == NULL )
{
return NULL;
}
if ( p_tree->p_right == NULL )
{
return p_tree;
}
return find_max( p_tree->p_right );
}
node* remove_max_node (node* p_tree, node* p_max_node)
{
if ( p_tree == NULL )
{
return NULL;
}
if ( p_tree == p_max_node )
{
return p_max_node->p_left;
}
p_tree->p_right = remove_max_node( p_tree->p_right, p_max_node );
return p_tree;
}
node* remove (node* p_tree, int key)
{
if ( p_tree == NULL )
{
return NULL;
}
if ( p_tree->key_value == key )
{
if ( p_tree->p_left == NULL )
{
node* p_right_subtree = p_tree->p_right;
delete p_tree
return p_right_subtree;
}
if ( p_tree->p_right == NULL )
{
node* p_left_subtree = p_tree->p_left;
delete p_tree;
return p_left_subtree;
}
node* p_max_node = find_max( p_tree->p_left );
p_max_node->p_left =
remove_max_node( p_tree->p_left, p_max_node );
p_max_node->p_right = p_tree->p_right;
delete p_tree;
return p_max_node;
}
else if ( key < p_tree->key_value )
{
p_tree->p_left = remove( p_tree->p_left, key );
}
else
{
p_tree->p_right = remove( p_tree->p_right, key );
}
return p_tree;
}
因此,作者执行删除目标节点并用最大值替换它,然后删除最大节点。
我的版本中没有发现任何缺点。但由于我对树木的经验不多,我想问你: 我的方法有缺点吗?作者更好吗?也许他的一个更糟糕,因为他使用额外的功能?谢谢!