信息检索之二叉搜索树binary_search_tree:创建、应用与可视化

本文通过小明的蔬菜检查任务引出二分法和二叉搜索树的概念,详细介绍了二叉搜索树的创建、操作,包括search、序列化输出dump和可视化输出view。二叉搜索树作为一种提高信息检索效率的数据结构,其可视化输出对于学习和理解树的形态非常有帮助。
摘要由CSDN通过智能技术生成

目录

1、小明的烦恼

2、二分法查找与二叉搜索树

2.1 二分法

2.2 二叉搜索树binary_search_tree

3、二叉搜索树的操作

3.1 数据操作search

3.2序列化输出dump

3.3可视化输出view

4、二叉搜索树在信息检索中的应用


1、小明的烦恼

这天,老师给全班同学布置一个任务:根据课文“我爱吃蔬菜”中介绍的蔬菜种类和特点,今晚请爸妈支持选择其中一种做晚餐,明天上课每位同学交作业时写下吃过的蔬菜名。老师已经在一份名单列出课文中所有蔬菜,小明将协助老师检查其他学生是否已准确区分各类蔬菜,即那些蔬菜名是否是名单蔬菜。

这份蔬菜名单较长,小明一时无法全部记下。全班45位同学,一一检查、逐一对比,每次比较后剩下的比较范围仅缩减一个单位,将花费不少时间,如何才能高效完成协助老师检查这项工作呢?

这时,同桌智多星小红见他满头大汗,知道小明又有难处,于是想了一想,很快画好一张图,扔给他后就蹦蹦跳跳回家去了。

小明接过图一看,顿时眼前一亮:

之前如果遇到四季豆,只有找到名单最后一个菜名才能确认,现在有小红的这个图,只要比较从上到下的层数就行,检查效率真的能提高很多呢!

2、二分法查找与二叉搜索树

2.1 二分法

小明按照小红给的图进行蔬菜名的确认检查,就是一准“二分法”。我们可以通过两张图来明确二分法的严格定义。

这张图精确地描述二分法查找过程,但是,真正的二分法查找有自己的条件,并且,在第4步不是精确度检查而是等值比较。

这里才是二分法查找的算法描述。从最后一段可以看出,k次比较可最多查找2的k次方个数据项,这效率不是一般的高。二分法有两个条件:线性表用顺序存储,线性表中数据元素有序。

2.2 二叉搜索树binary_search_tree

2.2.1 缘起

应该是4月3日晚,在一python技术交流群中遇到一问题求教。我当时本着交流互助(我也有问题向大家求教)的目的下载源码,如下:

class Node(object):
    """构造节点"""
    def __init__(self,item=None,lchild=None,rchild=None):
        
        self.elem=item
        self.lchild=lchild
        self.rchild=rchild
        
        
        
        
class binary_search_tree(object):
    """二叉查找树"""
    
    def __init__(self,li):
     
        self.root=None
        self.pre=None #父节点
         
         
        #构造节点群
        self.all_node=[Node(item=i) for i in li]
   
        #转换升序
        self.all_node.sort(key=lambda node:node.elem,reverse=False)
        #for i in self.all_node:
            #print(i.elem)

    def create(first,last,pre):  #构建搜索二叉树模型
    
        self.pre=pre
       
        #获取中间值下标
        mid=(first+last)//2
        
        #获取中间值节点(每次的根节点)
        mid_node=self.all_node[mid]
        
        
        #子序列元素最低分割长度为1
        if mid_node and mid >=0 and first <=last: 
        
        
        
            #如树为空,直接插入根节点
            if self.root==None:
                self.root=mid_node
                #每次的当前节点,都是下一次节点的父
                self.pre=pre
        
        
            #树不为空,插入左右子
            else:
  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值