二叉查找树节点的查找、插入和删除

二叉查找树常常会考到和使用到,本文练习下它的几个基本操作,即节点的查找、插入和删除及找最大值、最小值等。

1,二叉查找树的查找
由于二叉查找树的性质是,每个节点的关键字值大于其左子树的所有节点,同时小于右子树的所有节点。因此查找就可以利用其性质来进行。
实现代码如下:

/* node struct */
class node
{
public:
    int value;
    node* left;
    node* right;
};

node* find(node* root, const int key)
{
    if (NULL == root)
    {
        return NULL;
    }

    node* pos = root;

    while(NULL != pos)
    {
        if (key == pos -> value)
        {
            break;
        }
        else if (key < pos -> value)
        {
            pos = pos -> left;
        }
        else
        {
            pos = pos -> right;
        }
    }

    return pos;
}

2,二叉查找树找最大节点和最小节点
同样,利用二叉查找树的性质,有以下实现代码:

node* find_max(node* root)
{
    if (NULL == node)
    {
        return NULL;
    }

    node* pos = root;

    while (NULL != pos -> right)
    {
        pos = pos -> right;
    }

    return pos;
}

node* find_min(node* root)
{
    if (NULL == root)
    {
        return NULL;
    }

    node* pos = root;

    if (NULL != root -> left)
    {
        pos = pos -> left;
    }

    return pos;
}

3,二叉查找树的插入
往二叉查找树插入一个节点,需要保持二叉查找树的性质,因此一种插入的思想是运用二叉查找树的查找思想,查找新关键字应该放在树中的哪个位置,具体的实现代码如下(通过下面代码,可以知道在树中可以很方便的通过递归来实现相关操作):

node* insert(node* root, const int key)
{
    if (NULL == root)
    {
        root = new node;
        if (NULL == root)
        {
            return NULL;
        }
        root -> value = key;
        root -> left = NULL;
        root -> right = NULL;
        return root;
    }

    if (key < pos -> value)
    {
        root -> left = insert(root -> left, key);
    }
    else
    {
        root -> right = insert(root -> right, key);
    }

    return root;
}

4,最后看下二叉查找树的删除
删除分两种情况,一种是被删节点有一个子节点或0个子节点,另一种是被删子节点有两个子节点。对于前一种情况,处理较为简单,直接删除相应节点,若其有一个子节点,则将该子节点挂载到相应节点的父节点上;对于第二种情况,处理更复杂一些,一种处理方式是,将该节点的右子树的最小节点的关键字赋给当前节点,随后递归的在右子树中删除该最小节点,这样会一直递归到被删除的节点只有一个子节点或没有子节点。
在《数据结构与算法分析》上截两个删除示意图如下:
这里写图片描述
这里写图片描述
具体实现代码如下:

node* delete(node* root, const int key)
{
    if (NULL == root)
    {
        return NULL;
    }

    node* pos = NULL;

    if (key < root -> value)
    {
        root -> left = delete(root -> left, key);
    }
    else if (key > root -> value)
    {
        root -> right = delete(root -> right, key);
    }
    else    // find the node
    {
        if (NULL != root -> left && NULL != root -> right)
        {
            pos = find_min(root -> right);
            root -> value = pos -> value;
            root -> right = delete(root -> right, root -> value);
        }
        else
        {
            pos = root;
            if (NULL != root -> left)
            {
                root = root -> left;
            }
            else if (NULL != root -> right)
            {
                root = root -> right;
            }

            delete pos;
            pos = NULL;
        }
    }

    return root;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值