二叉搜索树的删除和添加

和算法导论上说明的一样,主要是实现下,给自己留着备用。

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值