python實現的二叉樹演算法和kmp演算法執行個體

來源:互聯網
上載者:User
主要是:前序走訪、中序遍曆、後序遍曆、層級遍曆、非遞迴前序走訪、非遞迴中序遍曆、非遞迴後序遍曆

複製代碼 代碼如下:


#!/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
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.