二分搜索树(Binary search tree)

二叉搜索树

二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,任何节点的键值大于等于该节点左子树中的所有键值,小于等于该节点右子树中的所有键值。 二叉搜索树可以看作是有序集合的树形存储,是一种用途非常广泛的基础数据结构。

BST的时间复杂度
操作类型 平均时间复杂度
Insert O(logn)
Delete O(logn)
Search O(logn)

实现

二叉搜索树主要提供insert, delete, search 三种操作,接下来首先定义结点,然后给出三个操作的实现。

typedef struct Single_Thread_BST_Node
{
    int value;
    struct Single_Thread_BST_Node *left;
    struct Single_Thread_BST_Node *right;
    struct Single_Thread_BST_Node *parent;
} ST_BST_Node;

每个结点维系三个指针,分别指向左孩子,右孩子,和父节点,另外附带一个整型的数据域。

搜索操作

搜索操作从头结点进行比较,如果大于,则进入右子树,小于,则进入左子树,等于,则返回结果(true和false)


插入操作

每次插入都要从头结点开始进行比较,>(大于)value,则进入右子树;<(小于)则进入左子树,一旦碰到空节点,则创建结点并链接到合适的父亲结点,。在我们的实现中,不允许重复的键值出现,因此等于(=)情况什么也不做。上面的过程,很容易用递归来实现。

void ST_BST::insert(int val,ST_BST_Node* cur_node)
{
    if(val < cur_node->value)
    {
        if(cur_node->left==nullptr)
        {
            cur_node->left=createNode(val,cur_node);
        }
        else
        {
            insert(val, cur_node->left);
        }
    }
    else if(val > cur_node->value)
    {
        if(cur_node->right==nullptr)
        {
            cur_node->right=createNode(val,cur_node);
        }
        else
        {
            insert(val, cur_node->right);
        }
    }
}


删除操作

删除操作相对于前面两个操作稍微复杂一点.

二分搜索树(Binary search tree)_第1张图片


1. 根据key找到要删除的结点。

2. 如果待删除的结点是叶子结点,直接将该节点删除;如果待删除的结点只有一个孩子结点,则将该节点的父节点相应的孩子结点指向唯一的孩子结点;

3.如果待删除的结点有两个孩子结点,则需要将该节点的前驱结点(左子树中key最大的结点)或者后继结点(右子树中key最小的结点)替换掉该节点的key。


以上面的图为例进行说明如何删除key=50的结点。 在(1)中,50的后继结点是61,因此用61替换掉50,然后删除后继结点。在(2)中,只有一个孩子的情况下,50的右孩子直接链接到其父节点100的右孩子结点上;在没有孩子的情况下,该结点直接被删除。


你可能感兴趣的:(C++)