从二叉树中删除的方法

时间:2015-03-10 12:41:30

标签: c++ tree binary-tree

我编写了一个代码,在查看我的学习手册之前从二叉树中删除了一个节点。这是:

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

因此,作者执行删除目标节点并用最大值替换它,然后删除最大节点。

我的版本中没有发现任何缺点。但由于我对树木的经验不多,我想问你: 我的方法有缺点吗?作者更好吗?也许他的一个更糟糕,因为他使用额外的功能?谢谢!

0 个答案:

没有答案