1.無序表查找:是數據不排序的線性查找,遍歷數據元素
def sequential_search(slist, key):
for i in xrange(len(slist)):
if slist[i] == key:
return i
return -1
sindex = sequential_search([1,3,4,7,5,8,2,9,6], 3)
print sindex
2.二分查找:查找表中不斷取中間元素與查找值進行比較,以二分之一的倍率進行表範圍的縮小
def middle_search(mlist,value):
if value > mlist[-1] or value < mlist[0]:
return -1
else:
start,end = 0,len(mlist)
while start < end:
middle = (start+end)/2
if mlist[middle] == value:
return middle
elif mlist[middle] > value:
end = middle
else:
start = middle
return -1
mindex = middle_search([1,2,3,4,5,6,7,8,9], 1)
print mindex
3.二叉排序樹:二叉排序樹又稱爲二叉查找樹;若它的左子樹不爲空,則左子樹上所有節點的值均小於它的根結構的值;若它的右子樹不爲空,則右子樹上所有節點的值均大於它的根結構的值;它的左、右子樹也分別爲二叉排序樹
# -*- coding:utf-8 -*-
class BSTNode:
"""
定義一個二叉樹節點類。
以討論算法爲主,忽略了一些諸如對數據類型進行判斷的問題。
"""
def __init__(self, data, left=None, right=None):
"""
初始化
:param data: 節點儲存的數據
:param left: 節點左子樹
:param right: 節點右子樹
"""
self.data = data
self.left = left
self.right = right
class BinarySortTree:
"""
基於BSTNode類的二叉排序樹。維護一個根節點的指針。
"""
def __init__(self):
self._root = None
def is_empty(self):
return self._root is None
def search(self, key):
"""
關鍵碼檢索
:param key: 關鍵碼
:return: 查詢節點或None
"""
bt = self._root
while bt:
entry = bt.data
if key < entry:
bt = bt.left
elif key > entry:
bt = bt.right
else:
return entry
return None
def insert(self, key):
"""
插入操作
:param key:關鍵碼
:return: 布爾值
"""
bt = self._root
if not bt:
self._root = BSTNode(key)
return
while True:
entry = bt.data
if key < entry:
if bt.left is None:
bt.left = BSTNode(key)
return
bt = bt.left
elif key > entry:
if bt.right is None:
bt.right = BSTNode(key)
return
bt = bt.right
else:
bt.data = key
return
def delete(self, key):
"""
二叉排序樹最複雜的方法
:param key: 關鍵碼
:return: 布爾值
"""
p, q = None, self._root # 維持p爲q的父節點,用於後面的鏈接操作
if not q:
print("空樹!")
return
while q and q.data != key:
p = q
if key < q.data:
q = q.left
else:
q = q.right
if not q: # 當樹中沒有關鍵碼key時,結束退出。
return
# 上面已將找到了要刪除的節點,用q引用。而p則是q的父節點或者None(q爲根節點時)。
if not q.left:
if p is None:
self._root = q.right
elif q is p.left:
p.left = q.right
else:
p.right = q.right
return
# 查找節點q的左子樹的最右節點,將q的右子樹鏈接爲該節點的右子樹
# 該方法可能會增大樹的深度,效率並不算高。可以設計其它的方法。
r = q.left
while r.right:
r = r.right
r.right = q.right
if p is None:
self._root = q.left
elif p.left is q:
p.left = q.left
else:
p.right = q.left
def __iter__(self):
"""
實現二叉樹的中序遍歷算法,
展示我們創建的二叉排序樹.
直接使用python內置的列表作爲一個棧。
:return: data
"""
stack = []
node = self._root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
yield node.data
node = node.right
lis = [62, 58, 88, 48, 73, 99, 35, 51, 93, 29, 37, 49, 56, 36, 50]
bs_tree = BinarySortTree()
for i in range(len(lis)):
bs_tree.insert(lis[i])
for i in bs_tree:
print i