1. 程式人生 > >二叉樹的遍歷,查詢,插入

二叉樹的遍歷,查詢,插入

遍歷二叉樹

二叉樹的特性一律從左向右遍歷

  • 中序遍歷:左子樹-樹根-右子樹
  • 前序遍歷:樹根-左子樹-右子樹
  • 後序遍歷:左子樹-右子樹-樹根

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