python实现的二叉树算法和kmp算法实例


Posted in Python onApril 25, 2014

主要是:前序遍历、中序遍历、后序遍历、层级遍历、非递归前序遍历、非递归中序遍历、非递归后序遍历

#!/usr/bin/env python
#-*- coding:utf8 -*-

class TreeNode(object):
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

class Tree(object):
    def __init__(self, root=None):
        self.root = None
    def makeTree(self, data, left, right):
        self.root = TreeNode(data, left, right)
    def is_empty(self):
        """是否为空 """
        if self.root is None:
            return True
        return False
    def preOrder(self, r):
        """前序遍历 """
        if not r.is_empty():
            print r.root.data
            if r.root.left is not None:
                r.preOrder(r.root.left)
            if r.root.right is not None:
                r.preOrder(r.root.right)
    def inOrder(self, r):
        """中序遍历 """
        if not r.is_empty():
            if r.root.left is not None:
                r.preOrder(r.root.left)
            print r.root.data
            if r.root.right is not None:
                r.preOrder(r.root.right)
    def postOrder(self, r):
        """后续遍历 """
        if not r.is_empty():
            if r.root.left is not None:
                r.preOrder(r.root.left)
            print r.root.data
            if r.root.right is not None:
                r.preOrder(r.root.right)
    def levelOrder(self, r):
        """层级遍历 """
        if not r.is_empty():
            s = [r]
            while len(s) > 0:
                temp = s.pop(0)  # 先弹出最先append到的点
                if temp and temp.root is not None:
                    print temp.root.data
                    if temp.root.left is not None:
                        s.append(temp.root.left)
                    if self.root.right is not None:
                        s.append(temp.root.right)
    def preOrder1(self, r):
        """非递归 前序遍历 """
        stack = []
        current = r
        while len(stack) > 0 or (current and not current.is_empty()):
            while current and not current.is_empty():
                print current.root.data
                stack.append(current)
                current = current.root.left
            if len(stack) > 0:
                current = stack.pop()
                current = current.root.right
    def inOrder1(self, r):
        """非递归 中序遍历 """
        stack = []
        current = r
        while len(stack) > 0 or (current and not current.is_empty()):
            while current and not current.is_empty():
                stack.append(current)
                current = current.root.left
            if len(stack) > 0:
                current = stack.pop()
                print current.root.data
                current = current.root.right
    def postOrder1(self, r):
        """非递归 后续遍历 """
        stack = []
        current = r
        pre = None
        while len(stack) > 0 or (current and not current.is_empty()):
            if current and not current.is_empty():
                stack.append(current)
                current = current.root.left
            elif stack[-1].root.right != pre:
                current = stack[-1].root.right
                pre = None
            else:
                pre = stack.pop()
                print pre.root.data
    def leaves_count(self, r):
        """求叶子节点个数 """
        if r.is_empty():
            return 0
        elif (not r.root.left) and (not r.root.right):
            return 1
        else:
            return r.root.left.leaves_count(r.root.left) + r.root.right.leaves_count(r.root.right)

if __name__ == '__main__':
    """二叉树"""
    ra, rb, rc, rd, re, rf = Tree(), Tree(), Tree(), Tree(), Tree(), Tree()
    ra.makeTree("a", None, None)
    rb.makeTree("b", None, None)
    rc.makeTree("c", None, None)
    rd.makeTree("d", None, None)
    re.makeTree("e", None, None)
    rf.makeTree("f", None, None)
    r1, r2, r3, r4, r = Tree(), Tree(), Tree(), Tree(), Tree()
    r1.makeTree("-", rc, rd)
    r2.makeTree("*", rb, r1)
    r3.makeTree("+", ra, r2)
    r4.makeTree("/", re, rf)
    r.makeTree("-", r3, r4)
    r.preOrder(r)
    r.inOrder(r)
    r.postOrder(r)
    r.levelOrder(r)
    print r.leaves_count(r)

大学的时候学过kmp算法,最近在看的时候发现竟然忘了,所以去重新看了看书,然后用python写下了这个算法:

def kmp(text, pattern):
    """kmp算法 """
    pattern = list(pattern)
    next = [-1] * len(pattern)
    #next 函数
    i, j = 1, -1
    for i in range(1, len(pattern)):
        j = next[i - 1]
        while True:
            if pattern[i - 1] == pattern[j] or j == -1:
                next[i] = j + 1
                break
            else:
                j = next[j]
    #循环比较
    i, j = 0, 0
    while i < len(text) and j < len(pattern):
        if text[i] == pattern[j] or j == -1:
            i += 1
            j += 1
        else:
            j = next[j]
    #返回结果 如果匹配,返回匹配的位置,否则返回-1
    if j == len(pattern):
        print i ? j
    else:
        print -1
Python 相关文章推荐
Python入门篇之函数
Oct 20 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
python实现字符串加密成纯数字
Mar 19 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
python中的__init__ 、__new__、__call__小结
Apr 25 #Python
Python yield 小结和实例
Apr 25 #Python
python计数排序和基数排序算法实例
Apr 25 #Python
python处理圆角图片、圆形图片的例子
Apr 25 #Python
python实现的阳历转阴历(农历)算法
Apr 25 #Python
Python实现的简单万年历例子分享
Apr 25 #Python
python实现simhash算法实例
Apr 25 #Python
You might like
在项目中寻找代码的坏命名
2012/07/14 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
使用python3实现操作串口详解
2019/01/01 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
使用pandas读取文件的实现
2019/07/31 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
工商治理实习生的自我评价分享
2014/02/20 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
商场消防安全责任书
2014/07/29 职场文书
五年级小学生评语
2014/12/26 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
市级三好生竞选稿
2015/11/21 职场文书
小学英语课教学反思
2016/02/15 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android