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之永远强大的函数
Sep 14 Python
Python实现的检测web服务器健康状况的小程序
Sep 17 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
python获取mp3文件信息的方法
Jun 15 Python
Python Requests 基础入门
Apr 07 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
python采集微信公众号文章
Dec 20 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
python实现在线翻译功能
Mar 03 Python
Python闭包与装饰器原理及实例解析
Apr 30 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
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
Knockoutjs的环境搭建教程
2012/11/26 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
js的2种继承方式详解
2014/03/04 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
提升Python程序性能的7个习惯
2019/04/14 Python
python字典的常用方法总结
2019/07/31 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
浅谈Python 参数与变量
2020/06/20 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
python MD5加密的示例
2020/10/19 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
房屋出租委托书格式
2014/09/23 职场文书
加班费申请报告
2015/05/15 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS