热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

二叉搜索树的一些相关算法介绍

二叉搜索树中,左子树值大于根节点,右子树值大于根节点,每一层子树都遵守以上规则。二叉搜索能够大大加快搜索速度,常规的搜索只能一个个比较,算法复杂度为n,二叉搜索树由于其结果特点能够将搜索负载度减小为log(n)。首先考虑节点的插入:从根节点开始,如果待插入节点的值大于根节点则向右子树查找,否则向左子树查找,直到到达叶节

二叉搜索树中,左子树值大于根节点,右子树值大于根节点,每一层子树都遵守以上规则。二叉搜索能够大大加快搜索速度,常规的搜索只能一个个比较,算法复杂度为n,二叉搜索树由于其结果特点能够将搜索负载度减小为log(n)。

首先定义二叉树的节点数据结构:

struct Tree
{
	struct Tree *p;
	struct Tree *l;
	struct Tree *r;
	char name[31];
	int num;
};

首先考虑节点的插入:

从根节点开始,如果待插入节点的值大于根节点则向右子树查找,否则向左子树查找,直到到达叶节点。如果叶节点值大于待插入节点,将待插入节点设为叶节点的左子树,否则为右子树。注意,考虑空树的情况。

void add_num(char name[],struct Tree * tree,struct Tree *parent)
{
    struct Tree * new_node;
    if(flag==true) return;
    if(tree==0) {
        flag=true;
        new_node=new struct Tree();
        init(new_node);
        strcpy(new_node->name,name);
        new_node->num++;;
        if(parent==0) root=new_node;
        else 
        {
            if(strcmp(new_node->name,parent->name)>0)
            {
                parent->r=new_node;
            }
            else 
                parent->l=new_node;
            new_node->p=parent;
        }
        return;
    } 
    else 
    {
        if(strcmp(tree->name,name)==0) {tree->num++;flag=true;return;}
        else if(strcmp(tree->name,name)>0)
        {
            add_num(name,tree->l,tree);
        }
        else 
        {
            add_num(name,tree->r,tree);
        }
    }
}

删除节点:

删除节点操作比较复杂,需要进行分类讨论。当带删除节点不存左右儿子时,可以直接删掉;如果不同时存在左右儿子,假设存在左儿子,则删除节点后将其儿子作为其父亲的左儿子;

如果同时存在左右儿子,则需要找到其后继结点(大于他的最小节点),将其值拷贝到待删除节点位置,并且删除其后继结点(其后继结点不可能同时存在左右儿子!)

寻找后继结点的方法:如果其右子树不为空,则寻找右子树中的最小值,即查找右子树中最左边的节点值便可;如果其右子树为空,则其后继结点可能为当前节点的某一级的祖先,因此,一直向上循环查找,直到当前节点为父节点的左儿子为止,注意当前节点也是不断向上更新的。

寻找后继结点的代码:

struct Tree* successor(struct Tree *tree)
{
    struct Tree *temp,*temp1;
    if(tree->r!=0) return find_min(tree->r);
    temp1=tree;
    temp=tree->p;
    while(temp!=0&&temp->r==temp1)
    {
        temp1=temp;
        temp=temp->p;
    }
    if(temp==0) return tree; //如果不存在后继则返回自身
    else return temp;        //否则返回后继结点
}

删除节点的代码:(这里删除的是最小节点)

struct Tree* delete_min()
{
    struct Tree * tree=find_min(root); //找到value最小的那个节点
    struct Tree * temp1,*temp2;
    if(tree->l==0||tree->r==0)         //如果左子树或者右子树不存在
        temp1=tree;
    else temp1=successor(tree);       //如果存在左右儿子,则找到后继结点
    if(temp1->l!=0) temp2=temp1->l;
    else temp2=temp1->r;
    if(temp2!=0) temp2->p=temp1->p;
    if(temp1->p==0) root=temp2;       //
    else if(temp1==temp1->p->l) temp1->p->l=temp2;
    else temp1->p->r=temp2;
    if(temp1!=tree) tree->num=temp1->num;
    return temp1;
}

寻找最小值: 其实很简单,就是找整棵树的最左边的节点!

struct Tree* find_min(struct Tree *tree)
{
    if(tree->l!=0) return find_min(tree->l);
    else return tree;
}

最后,输出树也是很简单的递归,比如按照中序输出:

void search(struct Tree *tree)
{
    if(tree!=0)
    {
        printf("%s\n",tree->name);
        if(tree->l!=0)  search(tree->l);
        else if(tree->r!=0) search(tree->r);
    
    }
}

以上是链表形式的二叉搜索树的一些基本操作,以作备忘。

本文地址:http://www.nowamagic.net/librarys/veda/detail/206,欢迎访问原出处。


推荐阅读
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了 Python 列表切片的基本概念和实际应用,通过具体示例展示了不同切片方式的使用方法及其背后的逻辑。 ... [详细]
  • 本文详细介绍了K-Medoids聚类算法,这是一种基于划分的聚类方法,适用于处理大规模数据集。文章探讨了其优点、缺点以及具体实现步骤,并通过实例进行说明。 ... [详细]
  • 本文探讨如何利用人工智能算法自动区分网页是详情页还是列表页,介绍具体的实现思路和技术细节。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 解决Windows 10无法正确加载ICA文件的问题:设置Citrix Receiver为默认打开程序
    当在Windows 10系统中遇到无法正确加载ICA文件的情况时,可以通过下载并安装Citrix Receiver,并将其设置为ICA文件的默认打开方式来解决问题。具体操作步骤包括找到ICA文件,选择合适的打开程序路径(通常是C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe),并确保该程序被设为始终使用。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
author-avatar
fengfeng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有