目录
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: