2-資料結構與演算法-二叉樹和排序二叉樹
阿新 • • 發佈:2020-08-06
二叉樹
- 根節點
- 柱狀結構最上層的一個節點
- 葉子節點
- 左葉子節點
- 右葉子節點
- 完整的子樹
- 是由根節點,左右葉子節點組成
- 非完整的子樹
- 根節點,左葉子節點
- 根節點,右葉子節點
- 根節點
- 特性:二叉樹中的任意一個節點都可以被視為另一顆子樹的根節點
- 如果我們想要區分不同的子樹,使用根節點作為區分的標準。
# 建立節點類 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
二叉樹的遍歷
- 廣度遍歷
- 自上而下逐層遍歷節點
- 深度遍歷:基於子樹遍歷。可以將前中後序遍歷以此作用在不同的子樹中即可。每一顆子樹中都會有一個根節點。
- 豎向遍歷的方式
- 方式:以此作用在每一個子樹
- 前序:根左右
- 中序:左根右
- 後序:左右根