python 实现常见的搜索算法


# coding=utf-8

"""
二分查找的简单介绍
1、二分查找的对象必须是排序后的对象
2、只能作用在顺序表上(支持下表索引)
3、时间复杂度,O(logn)
"""
def binary_search(alist,item):
    """
    二分查找
    :param alist:
    :return:
    """

    start = 0
    end = len(alist)
    mid = (start+end)//2

    if end > start:
        if alist[mid]>item:
            return binary_search(alist[:mid],item)
        elif alist[mid] == item:
            return True
        else:
            return binary_search(alist[mid+1:], item)
    else:
        return False


if __name__ == "__main__":
    alist = [1,2,3,4,5]
    # print(binary_search(alist,5))

#树结构介绍
"""
1、每个节点有零个或多个子节点
2、没有父节点的节点称为根节点
3、每个非根节点有且只有一个父几点
4、除了根节点,每个子节点可以分为多个不相交的子树

树的术语:
1、节点的度:一个节点含有的子树的个数称为节点的度(简单的来说就是指节点下子节点的个数)
2、树的度:树种节点的度的最大值就是树的度
3、叶几点或终端节点:度为零的节点
4、父节点:若一个节点有子节点,则这个节点称为其子节点的父节点
5、兄弟节点:同一个父节点的节点称为父节点
6、节点的层次:从上往下,根节点为第一层,根的子节点为第二层,依次类推
7、树的高度:树中节点的最大层
8、堂兄弟节点:父节点为层上节点的子节点
9、节点祖先:一个节点上的所有节点
10、子孙几点:一个节点下关联的全部节点
11、多个不相交的树的集合称为森林

树的种类
1、无序树:树中的节点中的元素没有任何顺序关联
2、有序树:有顺序结构
    i、二叉树:每个节点最多只含两个子树
        完全二叉树:除了最底层外,其他的所有几点都达到了最大的度
        满二叉树:所有节点的度都达到最大的度
        平衡二叉树:树中子树的高度差不大于一
        排序二叉树:树的左子树上的值均小于等于他的根(不为空),树的右子树上的值均大于等于他的根(不为空),左右子树分别又是二叉树


树的应用场景
1、html、xml等
2、路由协议
3、mysql数据库索引
4、文件系统的目录结构
5、AI经典算法


二叉树性质
1、在二叉树的第i层上至多有2^(i-1)个节点
2、在二叉树的深度为i层,总节点至多有2^i-1个节点
3、对于任意一个二叉树,如果子叶节点数为N0,且度数为2的节点数为N2,则N0 = N2+1
4、完全二叉树节点数为n,则深度为log2(n+1)
5、总节点数n = n0+n1+n2,一个度为2的节点有两个子节点,一个度为一的节点有一个子节点可得n=1+n1+2*n2

推导
n = 2^(k-2)+n0 -1 n1= n0-(n0//2) n2 = 2*(k-2)- 1 + n0//2  n = n0 + n1 +n2
n = n0-(n0//2) + 2*(k-2)- 1 + n0//2 = n0 + 2*(k-2)-1
二叉树的全部节点B = n-1,同时B = n1 + 2*n2,n = n1+2*n2+1,结合n = n0+n1+n2 -->>n0=n2+1


"""
class Node:
    def __init__(self,item):
        self.item = item
        self.lchild = None
        self.rchild = 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_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

        ##广度遍历
    def breath_travel(self):
        if self.root is None:
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.item)
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

    ##深度遍历 先序遍历 根 - 左 - 右
    def  preoder(self,node):

        if node == None:
            return
        print(node.item)
        self.preoder(node.lchild)
        self.preoder(node.rchild)



    ##深度遍历 中序遍历   左 - 根 - 右
    def midoder(self, node):

        if node == None:
            return
        self.midoder(node.lchild)
        print(node.item)
        self.midoder(node.rchild)


    ##深度遍历 后序遍历  左 - 右 - 根
    def postoder(self, node):

        if node == None:
            return
        self.postoder(node.lchild)
        self.postoder(node.rchild)
        print(node.item)
# tree = Tree()
# tree.add(0)
# tree.add(1)
# tree.add(2)
# tree.add(3)
# print(tree)
# print()
# tree.breath_travel()
# print("===============")
# tree.preoder(tree.root)
# print("===============")
# tree.midoder(tree.root)
# print("===============")
# tree.postoder(tree.root)


##二叉搜索树

class Tree_search:
    def __init__(self):
        self.root = None


    def add(self,item,root):
        node = Node(item)
        if root == None:
            root = node
        if self.root == None:
            self.root = node
        elif root.item > item:
            root.lchild = self.add(item,root.lchild)
        elif root.item < item:
            root.rchild = self.add(item,root.rchild)
        return root

tree_search = Tree_search()
tree_search.add(1,tree_search.root)
tree_search.add(3,tree_search.root)
tree_search.add(4,tree_search.root)
tree_search.add(6,tree_search.root)
tree_search.add(7,tree_search.root)
print(tree_search)
print()

突然不想写了,之后会继续完善的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值