今天我們要介紹的是一種特殊的二叉樹——二叉搜索樹,同時我們也會講到一種排序算法——二叉樹排序算法。這兩者之間有什么聯系呢,我們一起來看一下吧。
開始之前呢,我們先來介紹一下如何創建一顆二叉搜索樹。
假設我們有這樣一些數據:[9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]
我們就用這些數據來創建二叉排序樹。
首先,我們將第一個數據9
作為二叉排序樹的根節點,
然后我們拿到第二個數據5
,現在我們要進行判斷,如果5
比9
小,那么就將5
插入到節點9
的左子樹;如果5
比9
大的話,就把5
插入到9
的右子樹。經過判斷,我們將5
插入到9
的右左子樹,因為9
的左節點為空,所以我們直接將5
作為9
的左節點。
接下來判斷第三個數據2
,我們同樣先將2
和9
進行判斷,將2
插入到9
的左子樹,但是9
的左節點不為空,所以我們再將2
與9
的左節點5
進行判斷。2
比5
小,並且5
的左節點為空,所以將2
作為5
的左節點。
以此類推,我們就可以畫出一顆二叉搜索樹,感興趣的同學不妨親自畫一下。
那二叉樹排序有是怎么回事呢?
我們回過頭來看我們剛剛創建好的二叉樹,前面我們已經介紹過了二叉樹的前序、中序、后序遍歷。我們不妨來嘗試一下二叉搜索樹的三序遍歷。
如果對二叉樹進行三序遍歷的話,你就會發現,二叉搜索的中序遍歷結果恰好就是從小到大排列的。
那我們就明白了,創建二叉搜索樹並進行中序遍歷就可以實現排序。
接下來照例我們用代碼實現二叉搜索樹和二叉樹排序:
#-*- coding: utf-8 -*-
class BinaryTree:
def __init__(self, data):
self.left = None
self.right = None
if type(data) == list:
self.data = data[0]
for d in data[1:]:
self.insert(d)
else:
self.data = data
def insert(self, data):
bt = self
while True:
if data <= bt.data:
if bt.left == None:
bt.left = BinaryTree(data)
break
else:
bt = bt.left
else:
if bt.right == None:
bt.right = BinaryTree(data)
break
else:
bt = bt.right
def mid_order(self):
result = []
stack = []
node = self
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
result.append(node.data)
node = node.right
return result
上面呢,我們定義了一個二叉樹類,並實現了節點的插入和中序遍歷方法。在它的構造方法中,如果輸入的參數是一個列表,那么我們就根據列表創建二叉搜索樹,如果是一個值那么就之創建一個根節點。
下面我們就來創建一下二叉搜索樹:
data = [9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]
bt = BinaryTree(data)
mid = bt.mid_order()
print(mid)
執行一下,輸出的結果是這樣的
[1, 1, 2, 2, 2, 4, 4, 5, 9, 9, 10, 11, 11, 12, 16, 22, 23, 24, 27, 31, 35, 35, 35, 41, 45, 56, 73]
你學會了嗎?