手机
当前位置:查字典教程网 >脚本专栏 >python >python实现的二叉树算法和kmp算法实例
python实现的二叉树算法和kmp算法实例
摘要:主要是:前序遍历、中序遍历、后序遍历、层级遍历、非递归前序遍历、非递归中序遍历、非递归后序遍历复制代码代码如下:#!/usr/bin/env...

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

复制代码 代码如下:

#!/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实现的二叉树算法和kmp算法实例】相关文章:

python实现类似ftp传输文件的网络程序示例

python实现博客文章爬虫示例

python 实现归并排序算法

python使用rabbitmq实现网络爬虫示例

python装饰器使用方法实例

python 实现堆排序算法代码

python实现rest请求api示例

python实现排序算法

python实现k均值算法示例(k均值聚类算法)

python列表去重的二种方法

精品推荐
分类导航