二叉搜索树的创建,插入,查找过程实现

基于顺序查找
数据随机:顺序查找,遍历 时间复杂度O(N)
数据已序:二分查找,时间复杂度O(log2^N)
索引顺序:数据量大,建立静态索引

基于树形查找
二叉树: 二叉搜索树,二叉平衡树
多叉树: B-树,B+树,B*树

基于哈希查找
哈希:哈希表,哈希桶,位图,布隆过滤器,

二叉搜索树(二叉排序树)
特点:
左子树不为空,则左子树上所有节点小于根节点的值
右子树不为空,则右子树上所有节点大于根节点的值
它的左右子树也为二叉搜索树
*中序遍历为递增序列

//
二叉搜索树的操作:
查找

     若根节点不为空
        如果根节点key==查找key,返回true
        如查找key<根节点key,在左子树查找
      	如查找key>根节点key,在右子树查找

插入
在二叉搜索树中插入新元素,必须先检测该元素是否在树中已经存在 ,若存在则不进行插入操作,否则将新元素加入到搜索停止的地方

树为空,则直接插入,返回true
树不为空,按二叉搜索树性质查找插入的位置,插入新节点

删除
首先查找元素是否存在二叉搜索树中,如果不存在,返回。
若存在则删除情况如下

        a.要删除的节点无孩子节点
                直接删除该节点
        b.要删除的节点只有左孩子节点
                删除该节点,且双亲节点指向被删节点的左孩子节点
        c.要删除的节点只有右孩子节点
                删除该节点,且双亲节点指向被删节点的右孩子节点
        d.要删除的节点有左右孩子节点
                在它的右子树中寻找中序下的第一个节点(关键码最小),
                用它的值填补到被删节点中,再处理该节点的删除问题。

二叉搜索树应用

判断一个单词是否拼写正确
模拟实现一个简单的字典
log文件中有许多异常重复的IP地址,统计每个异常IP出现了多少次

二叉搜索树的基本操作

//二叉搜索树的创建
//递归算法,确定一个根节点,比根节点小的值放左边,比根节点大的值放右边。

#include<iostream>
using namespace std;


typedef struct TreeNode
{
    char data;
    struct TreeNode* lchild;
    struct TreeNode* rchild;
};

//创建  
template<class T>   //中序遍历是递增序列(检测时候使用)
TreeNode* SortBinaryTree(TreeNode* root, const T& val)
{
    if (root == NULL)
    { 
        root = new TreeNode(val);    //根节点为空,插入,返回。
        return root;
    }
    else  
    {
        if (val <= root->data)  //小于等于根节点,递归插入左子树
        {
            root->lchild = SortBinaryTree(root->lchild, val);
        }
        else   //大于根节点,递归插入右子树
        {
            root->rchild = SortBinaryTree(root->rchild, val);
        }
    }
    return root;
}


//查找操作
template<class T>
TreeNode* find(TreeNode* root, const T&key)
{
    TreeNode* cur = root;
    while (cur != NULL&&cur->data != key)  //当查找元素不为空且与根节点不同
    {
        if (key < cur->data)    //小于根节点左子树找
        {
            cur = cur->lchild;
        }
        else   //大于根节点右子树找
        {
            cur = cur->rchild;
        }
    }
    if (cur == NULL)  //若cur=NULL则说明遍历完没有找到,
        return NULL;
    return cur;  
}

//插入节点
//类似查找,只需要查找到左子树或者右子树为空的位置插入

template<class T>
void Insert(TreeNode* root, const T& val)
{
    if (root == NULL)  //根节点为空,直接插入,返回。
    {
        root = new TreeNode(val);
        return;
    }
    TreeNode* cur = root;
    TreeNode* parent = NULL;
    bool isLeftchild = true;  //设置flag判断插入的位置在左子树还是右子树中

    while (cur != NULL) //遍历查找空位置
    {
        parent = cur; 
        if (val < cur->data)  //插入值小于根节点
        {
            cur = cur->lchild;  //在左子树中
            isLeftchild = true;
        }
        else  //插入值大于根节点
        {
            cur = cur->rchild;  //在右子树中
            isLeftchild = false;
        }  
    }
    TreeNode* new_node = new TreeNode(val);//创建新节点
    if (isLeftchild)   //根据标志位判断插入位置是否在左子树
    {
        parent->lchild=new_node;   //插入当前节点的左孩子
    }
    else
    {
        parent->rchild = new_node;  //插入当前节点的右孩子
    }
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/yu876876/article/details/84191178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞