博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构 --- 03.查找, 二叉树
阅读量:4879 次
发布时间:2019-06-11

本文共 5763 字,大约阅读时间需要 19 分钟。

一.查找

  1.顺序查找(列表无序)

顺序查找原理剖析:  从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,   直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。
def search(alist,item):    find = False    length = len(alist)        for i in range(length):        if alist[i] == item:            find = True                return find
alist = [3,8,5,7,6,4]print(search(alist,51)) #False

 

  2.顺序查找(列表有序)

def search(alist,item):    length = len(alist)    find = False    pos = 0    stop = False    while pos <= length and not stop:        if alist[pos] == item:            find = True            break        elif alist[pos] > item:            stop = True        else:            pos += 1    return find
alist = [1,3,5,7,9,11]print(search(alist,5)) #True

 

  3.二分查找(重要)

  有序列表对于我们的实现搜索是很有用的。在顺序查找中,当我们与第一个元素进行比较时, 如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较。 二分查找则是 从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成 了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。如果我们正在 查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在 列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始, 将其与我们正在寻找的内容进行比较

 

def search(alist,item):    last = len(alist)-1    first = 0    find = False        while first<=last and not find:        mid = (last+first) // 2        if alist[mid] == item:            find = True        else:            if alist[mid] > item:                last = mid - 1            else:                first = mid + 1    return find
alist = [1,3,5,7,9]print(search(alist,31))
# False

 

二. 二叉树

二叉树  - 跟节点  - 左叶子节点  - 右叶子节点  - 子树
二叉树遍历  广度遍历:层级遍历  深度遍历    前序:根左右    中序:左根右    后序:左右根排序二叉树

 

 

 

  1.二叉树的创建及广度遍历

class Node():    def __init__(self,item):        self.item = item        self.left = None        self.right = None
class Tree():    #构造方法可以构造一个空树    def __init__(self):        self.root = None    def add(self,item):        node = Node(item)        #判断树为空        if self.root == None:            self.root = node            return        #树为非空的插入操作,创建一个可操作的列表        queue = [self.root]                while queue:            cur = queue.pop(0)            if cur.left == None:                cur.left = node                return            else:                queue.append(cur.left)            if cur.right == None:                cur.right = node                return            else:                queue.append(cur.right)    #广度遍历    def travel(self):        queue = [self.root]        while queue:            cur = queue.pop(0)            print(cur.item)            if cur.left is not None:                queue.append(cur.left)            if cur.right is not None:                queue.append(cur.right)
tree = Tree()tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.add(6)tree.add(7)tree.add(8)tree.add(9)tree.add(10)tree.travel() # 1 2 3 4 5 6 7 8 9 10

 

  2.深度遍历

class Node():    def __init__(self,item):        self.item = item        self.left = None        self.right = None
class Tree():    #构造方法可以构造一个空树    def __init__(self):        self.root = None    def add(self,item):        node = Node(item)        #判断树为空        if self.root == None:            self.root = node            return        #树为非空的插入操作        queue = [self.root]                while queue:            cur = queue.pop(0)            if cur.left == None:                cur.left = node                return            else:                queue.append(cur.left)            if cur.right == None:                cur.right = node                return            else:                queue.append(cur.right)
#深度遍历    def forward(self,root): #根左右        if root == None:            return        print(root.item,end=' ')        self.forward(root.left)        self.forward(root.right)            def mid(self,root):#左根右        if root == None:            return        self.mid(root.left)        print(root.item,end=' ')        self.mid(root.right)            def back(self,root):#左右根        if root == None:            return        self.back(root.left)        self.back(root.right)        print(root.item,end=' ')
tree = Tree()tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.add(6)tree.add(7)tree.add(8)tree.add(9)tree.add(10)tree.forward(tree.root)print('\n')tree.mid(tree.root)print('\n')tree.back(tree.root)print('\n')

 

结果为: 1 2 4 8 9 5 10 3 6 7 8 4 9 2 10 5 1 6 3 7 8 9 4 10 5 2 6 7 3 1

 

  3.排序二叉树

class Node():    def __init__(self,item):        self.item = item        self.left = None        self.right = Noneclass Tree():    #构造方法可以构造一个空树    def __init__(self):        self.root = None    #需要根据一个准则将节点进行插入,准则:比根节点小的数据插入到左侧,比根节点大的数插入到右侧    def insert(self,item):        node = Node(item)        if self.root == None:            self.root = node            return        cur = self.root        #右        while True:            if item > cur.item:                if cur.right == None:                    cur.right = node                    return                else:                    cur = cur.right            else:                if cur.left == None:                    cur.left = node                    return                else:                    cur = cur.left             #深度遍历    def forward(self,root): #根左右        if root == None:            return        print(root.item,end=' ')        self.forward(root.left)        self.forward(root.right)            def mid(self,root):#左根右        if root == None:            return        self.mid(root.left)        print(root.item,end=' ')        self.mid(root.right)            def back(self,root):#左右根        if root == None:            return        self.back(root.left)        self.back(root.right)        print(root.item,end=' ')
tree = Tree()tree.insert(3)tree.insert(0)tree.insert(2)tree.insert(9)tree.insert(1)tree.insert(6)tree.insert(4)tree.forward(tree.root)print('\n')tree.mid(tree.root)print('\n')tree.back(tree.root)print('\n')

 

转载于:https://www.cnblogs.com/lw1095950124/p/11192806.html

你可能感兴趣的文章
C#防SQL注入代码的实现方法
查看>>
图论专题总结
查看>>
JavaScript实现无刷新评论及在IE下的剪切板访问(学习)
查看>>
电子优惠券平台基本流程图
查看>>
[转]World Wind Java开发之五——读取本地shp文件
查看>>
一、程序设计与C语言
查看>>
JavaScript葵花宝典之闭包
查看>>
JMeter学习资料集锦
查看>>
树形动态规划
查看>>
https请求带证书发送报文
查看>>
学习内容
查看>>
在你的iPad上调整图片尺寸
查看>>
关于《注意力模型--Attention注意力机制》的学习
查看>>
每日一问:View.getContext() 的返回一定是 Activity 么?
查看>>
MongoDB允许其它IP地址访问
查看>>
EXC_BAD_ACCESS的本质详解以及僵尸模式调试原理
查看>>
[SQLServer大对象]——FileTable初体验
查看>>
控制器的回跳的两个方法
查看>>
201521123083《Java程序设计》第二周学习总结
查看>>
Android OpenGL ES 开发(二): OpenGL ES 环境搭建
查看>>