1. 程式人生 > 實用技巧 >2-資料結構與演算法-二叉樹和排序二叉樹

2-資料結構與演算法-二叉樹和排序二叉樹

二叉樹

  • 根節點
    • 柱狀結構最上層的一個節點
  • 葉子節點
    • 左葉子節點
    • 右葉子節點
  • 完整的子樹
    • 是由根節點,左右葉子節點組成
  • 非完整的子樹
    • 根節點,左葉子節點
    • 根節點,右葉子節點
    • 根節點
  • 特性:二叉樹中的任意一個節點都可以被視為另一顆子樹的根節點
    • 如果我們想要區分不同的子樹,使用根節點作為區分的標準
# 建立節點類
class Node():
    def __init__(self,item):
        self.item = item
        self.left = None
        self.right = None

        
# 建立一棵樹 class Tree(): def __init__(self): # 構建一顆空樹 self.root = None # 鏈頭,指向最上邊的根節點 def addNode(self, item): node = Node(item) # 如果self.root指向為,則是一顆空樹 if self.root == None: self.root = node return # 樹為非空 cur = self.root q
= [cur] while True: pop_node = q.pop(0) # 將第一個節點取出 if pop_node.left == None: # 判斷這個節點左邊是不是為空 pop_node.left = node # 如果為空就將資料新增進去 break # 新增進去資料就結束迴圈 else: q.append(pop_node.left) # 如果不為空,就把它加到列表當中
if pop_node.right == None: # 判斷這個節點右邊是不是為空 pop_node.right = node # 如果為空就將資料新增進去 break # 新增進去資料就結束迴圈 else: q.append(pop_node.right) # 如果不為空,就把它加到列表當中 # 廣度遍歷,遍歷整棵樹 def travel(self): cur = self.root q = [cur] while q: pop_node = q.pop(0) print(pop_node.item) if pop_node.left != None: q.append(pop_node.left) if pop_node.right != None: q.append(pop_node.right) tree = Tree() l = [1,2,3,4,5,6] for i in l: tree.addNode(i) tree.travel() 1 2 3 4 5 6

二叉樹的遍歷

  • 廣度遍歷
    • 自上而下逐層遍歷節點
  • 深度遍歷:基於子樹遍歷。可以將前中後序遍歷以此作用在不同的子樹中即可。每一顆子樹中都會有一個根節點。
    • 豎向遍歷的方式
    • 方式:以此作用在每一個子樹
      • 前序:根左右
      • 中序:左根右
      • 後序:左右根