二叉樹的遍歷,查詢,插入
阿新 • • 發佈:2018-12-28
遍歷二叉樹
二叉樹的特性一律從左向右遍歷
- 中序遍歷:左子樹-樹根-右子樹
- 前序遍歷:樹根-左子樹-右子樹
- 後序遍歷:左子樹-右子樹-樹根
1,中序遍歷
中序遍歷子程式
def inorder(ptr):
if ptr != None:
inorder(ptr.left)
print('[%2d]' % ptr.data,end=' ')
inorder(ptr.right)
2.後序遍歷
def postorder(ptr):
if ptr != None:
postorder( ptr.left)
postorder(ptr.right)
print('[%2d]' % ptr.data,end=' ')
3.前序遍歷
def perorder(ptr):
if ptr != None:
print('[%2d]'% ptr.data, end =' ')
perorder(ptr.left)
perorder(ptr.right)
建立一個二叉樹,節點資料分別是[5,6,24,8,12,3,17,1,9],根據連結串列建立二叉樹,最後進行中序遍歷,可以發現可以輕鬆完成從小到大的排序
'''
建立二叉樹的節點
'''
class tree:
def __init__(self):
self.data = 0
self.left = None
self.right = None
# 建立二叉樹
def create_tree(root,val):
#將傳入的int型別的val轉換為樹節點型別
newnode = tree()
newnode.data = val
newnode.right = None
newnode.left = None
#如果傳入的root為None,說明是空樹,新節點設定為樹根
if root == None:
root = newnode
return root
#如果不是空樹,找到合適的位置插入樹節點
else:
current = root
while current != None:
backup = current
if current.data > val:
current = current.left
else:
current = current.right
if backup.data > val:
backup.left = newnode
else:
backup.right = newnode
return root
#主程式
data = [5,6,24,8,12,3,17,1,9]
ptr = None
for i in range(len(data)):
ptr = create_tree(ptr,data[i])
print("=============================================")
print('中序完成的結果')
inorder(ptr)
print('')
print("=============================================")
print('前序完成的結果')
perorder(ptr)
print('')
print("=============================================")
print('後序完成的結果')
postorder(ptr)
print('')
=============================================
中序完成的結果
[ 1] [ 3] [ 5] [ 6] [ 8] [ 9] [12] [17] [24]
=============================================
前序完成的結果
[ 5] [ 3] [ 1] [ 6] [24] [ 8] [12] [ 9] [17]
=============================================
後序完成的結果
[ 1] [ 3] [ 9] [17] [12] [ 8] [24] [ 6] [ 5]
二叉樹的查詢
def search(ptr,val):
while True:
if ptr == None:
return None
if ptr.data == val:
return ptr
elif ptr.data > val:
ptr = ptr.left
else:
ptr = ptr.right
二叉樹的插入
- 判斷二叉樹中是否有這個值,有不用操作,沒有就將它插入在樹中
data = [1,4,6,23,2,12,24]
ptr = None
for val in data:
ptr = create_tree(ptr,val)
inorder(ptr)
data = int(input('輸入要插入的數:'))
if search(ptr,data) != None:
raise Exception('二叉樹中已經有此節點')
else:
create_tree(ptr,data)
inorder(ptr)
[ 1] [ 2] [ 4] [ 6] [12] [23] [24] 輸入要插入的數:5667
[ 1] [ 2] [ 4] [ 6] [12] [23] [24] [5667]
二叉節點的刪除
- 如果刪除的節點為樹葉,只要將與其相連的父節點指向None
- 刪除的節點只有一顆子樹,將它的右指標欄位放在它的父節點欄位
- 刪除的節點有兩顆子樹,有兩種處理辦法
- 找到中序立即先行者,找到該節點的左子樹一直往右尋找,直到右指標為None
- 找到中序立即後繼者,找到該節點的右子樹一直往左尋找,直到左指標為None