python数据结构基础算法(持续更新)

  • 冒泡排序

一般写法

def bubbleSort(my_list):
    length = len(my_list)
    for i in range(0,length):
        for j in range(i+1,length):
            if my_list[i] > my_list[j]:
                my_list[i],my_list[j] = my_list[j],my_list[i]
    return my_list
一般写法

reduce写法

def bubble_Sort(my_list):
    new_list = []
    while len(my_list)>0:
        ret = reduce(lambda x,y:y if x>y else x,my_list)
        new_list.append(ret)
        my_list.remove(ret)
    return new_list
reduce写法
  • 斐波那契数列

def fb(n):
    new_list = []
    for i in range(1,n+1):
        new_list.append(1) if i<3 else new_list.append(reduce(lambda x,y:x+y,[new_list[-2],new_list[-1]]))
    return new_list
斐波那契数列
  • 二分查找/折半查找

def ef_match(my_list,value):
    length = len(my_list)
    left,right=0,length
    while left<right:
        middle = (left + right) // 2
        if my_list[middle]>value:right=middle-1
        elif my_list[middle]<value:left=middle+1
        else:return middle
    return None
二分查找/折半查找
  •  八皇后问题

def queen(A, cur=0):
    if cur == len(A):#如果组合完毕,打印结果返回
        print(A)
        return 0
    for col in range(len(A)):#每行遍历8个位置进行选择
        A[cur], flag = col, True
        for row in range(cur):#检查前每行的位置是否与当前有冲突
            if A[row] == col or abs(col - A[row]) == cur - row:
#前面已选择的列=当前列   或者  (当前选择的值与第n行的差值 == 当前行与第n行的差值)即在对角线上
                flag = False#标记失败
                break#退出
        if flag:#如果不冲突
            queen(A, cur+1)#开始进行下一行的选择
            
queen([None]*8)
八皇后问题
  •  KMP

def kmp_next(string):
    my_mext= [0]*len(string)
    my_mext[0]=-1#特殊标记
    now,select=0,-1
    while now < len(string)-1:
        if select== -1 or string[now] ==string[select]:
            now += 1
            select += 1
            my_mext[now]=select
        else:
            select=my_mext[select]
    return my_mext

def kmp_nextval(string):
    my_mext= [0]*len(string)
    my_mext[0]=-1#特殊标记
    now,select=0,-1
    while now < len(string)-1:
        if select== -1 or string[now] ==string[select]:
            now += 1
            select += 1
            if string[now] !=string[select]:
                my_mext[now]=select
            else:
                my_mext[now] = my_mext[select]
        else:
            select=my_mext[select]
    return my_mext


def kmp_match(s,t):
    slen,tlen=len(s),len
    if slen >= tlen:
        i=j=0
        next = kmp_next(t)
        while i< slen:
            if j==-1 or s[i]==t[j]:
                i+=1
                j+=1
            else:
                j =next[j]
            if j==tlen:
                return i-tlen
    return False

if __name__ == '__main__':
    ret_next = kmp_next('abcabcaa')
    ret_nextavl = kmp_nextval('abcabcaa')
    print(ret_next)
    print(ret_nextavl)
KMP
  •  二叉树遍历

#!/usr/bin/python3
#coding:utf-8
'''
Created on 2018/09/14 10:48

@author: 刘蒙华
'''


class Node():
    def __init__(self, data=-1, lchild=None, rchild=None):
        self.data = data
        self.lchild = lchild
        self.rchild = rchild


class Tree():
    def __init__(self):
        self.root = Node()
        self.myQueue=[]

    def add(self, data):
        """为树添加节点"""
        node = Node(data)
        if self.root.data == -1:  # 如果树是空的,则对根节点赋值
            self.root = node
            self.myQueue.append(self.root)
        else:
            treeNode = self.myQueue[0]  # 此结点的子树还没有齐。
            if treeNode.lchild == None:
                treeNode.lchild = node
                self.myQueue.append(treeNode.lchild)
            else:
                treeNode.rchild = node
                self.myQueue.append(treeNode.rchild)
                self.myQueue.pop(0)  # 如果该结点存在右子树,将此结点丢弃。

    def front_digui(self, root):
        """
        利用递归实现树的先序遍历:
        若二叉树为空,则空操作返回。否则先访问根结点,然后前序遍历左子树,再前序遍历右子数
        """
        if root == None:
            return
        print(root.data)
        self.front_digui(root.lchild)
        self.front_digui(root.rchild)

    def middle_digui(self, root):
        """
        利用递归实现树的中序遍历:
        若二叉树为空,则空操作返回。否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树
        """
        if root == None:
            return
        self.middle_digui(root.lchild)
        print(root.data)
        self.middle_digui(root.rchild)

    def later_digui(self, root):
        """
        利用递归实现树的后序遍历:
        若二叉树为空,则空操作返回。否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。
        """
        if root == None:
            return
        self.later_digui(root.lchild)
        self.later_digui(root.rchild)
        print(root.data)

    def front_stack(self, root):
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:  # 从根节点开始,一直找它的左子树
                print(node.data)
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()  # while结束表示当前节点node为空,即前一个节点没有左子树了
            node = node.rchild  # 开始查看它的右子树

    def middle_stack(self, root):
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:  # 从根节点开始,一直找它的左子树
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()  # while结束表示当前节点node为空,即前一个节点没有左子树了
            print(node.data)
            node = node.rchild  # 开始查看它的右子树

    def later_stack(self, root):
        """利用堆栈实现树的后序遍历"""
        if root == None:
            return
        myStack1 = []
        myStack2 = []
        node = root
        myStack1.append(node)
        while myStack1:  # 这个while循环的功能是找出后序遍历的逆序,存在myStack2里面
            node = myStack1.pop()
            if node.lchild:
                myStack1.append(node.lchild)
            if node.rchild:
                myStack1.append(node.rchild)
            myStack2.append(node)
        while myStack2:  # 将myStack2中的元素出栈,即为后序遍历次序
            print(myStack2.pop().data)

    def level_queue(self,root):
        '''利用队列实现数的层次遍历'''
        if root == None:
            return
        myQueue = []
        node = root
        myQueue.append(node)
        while myQueue:
            node = myQueue.pop(0)
            print(node.data)
            if node.lchild != None:
                myQueue.append(node.lchild)
            if node.rchild != None:
                myQueue.append(node.rchild)




if __name__ == '__main__':
    elems = range(10)  # 生成十个数据作为树节点
    tree = Tree()  # 新建一个树对象
    for elem in elems:
        tree.add(elem)  # 逐个添加树的节点
    print(tree.__dict__)

    tree.middle_digui(tree.root)
二叉树遍历
  •  线索二叉树(中序)

#!/usr/bin/python3
#coding:utf-8
'''
Created on 2018/09/18 10:56

@author: 刘蒙华
'''

class Node():
    def __init__(self,data=-1):
        self.data = data
        self.ltag = 1
        self.lchild = None
        self.rtag = 1
        self.rchild = None

class Tree():
    def __init__(self):
        self.root = Node()
        self.queue = []

    def add(self,root):
        if self.root.data == -1:
            self.root = root
            self.queue.append(root)
        else:
            front = self.queue[0]
            if self.queue:
                if front.lchild == None:
                    front.ltag = 0
                    front.lchild = root
                    self.queue.append(root)
                else:
                    front.rtag = 0
                    front.rchild = root
                    self.queue.append(root)
                    self.queue.pop(0)

    def middle_digui(self,root):
        if root == None:
            return
        self.middle_digui(root.lchild)
        tree.queue.append(root)
        self.middle_digui(root.rchild)

elems = range(10)  # 生成十个数据作为树节点
tree = Tree()  # 新建一个树对象
for elem in elems:
    tree.add(Node(elem))  # 逐个添加树的节点

tree.queue =[]
tree.middle_digui(tree.root)
for number,i in enumerate(tree.queue):
    if i.ltag == 1 and number != 0:
        i.lchild = tree.queue[number-1]
    if i.rtag == 1 and number != len(tree.queue)-1:
        i.rchild = tree.queue[number+1]
for i in tree.queue:
    print(i.__dict__)
线索二叉树

 

posted @ 2018-08-16 08:48  mengnan254  阅读(236)  评论(0编辑  收藏  举报