二叉樹及其遍歷
阿新 • • 發佈:2021-08-20
二叉樹
-
基本概念
- 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”
-
根節點
- 樹中最頂部的節點
-
左葉子節點
-
右葉子節點
-
子樹
- 完整的子樹
- 根節點和左右葉子節點組成
- 不完整的子樹
- 根節點和左葉子節點
- 根節點和右葉子節點
- 根節點
- 特點:每一個節點都可以作為一棵子樹的根節點
- 完整的子樹
-
二叉樹節點表示以及樹的建立
# coding:utf-8 class Node: '''節點的實現''' def __init__(self,item): self.item = item self.left
二叉樹的遍歷
- 樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結點的資訊的訪問,即依次對樹中每個結點訪問一次且僅訪問一次,我們把這種對所有節點的訪問稱為遍歷(traversal)。那麼樹的兩種重要的遍歷模式是深度優先遍歷和廣度優先遍歷,深度優先一般用遞迴,廣度優先一般用佇列。一般情況下能用遞迴實現的演算法大部分也能用堆疊來實現。
- 深度優先遍歷(縱向遍歷):按照子樹中根節點的位置,可以分為以下3種形式
- 先序遍歷:根節點-左子樹-右子樹
- 中序遍歷:左子樹-根節點-右子樹
- 後序遍歷:左子樹-右子樹-根節點
- 深度遍歷實現思路:
- 深度遍歷是需要作用到每一棵子樹中
- 子樹和子樹的區別體現在根節點中
- 如果寫一個函式,該函式可以將一棵子樹中的節點進行遍歷,則將該函式作用其它函式中,就可以實現深度遍歷
def pre_order(self,root): '''先序排列''' if root == None: return print(root.item) self.pre_order(root.left) self.pre_order(root.right) def middle_order(self,root): '''中序排列''' if root == None: return self.middle_order(root.left) print(root.item) self.middle_order(root.right) def post_order(self,root): '''後序排列''' if root == None: return self.post_order(root.left) self.post_order(root.right) print(root.item)
- 廣度優先遍歷(層次遍歷):從樹的根節點開始,從上到下,從左到右遍歷整個樹的節點
def travel(self): '''廣度優先遍歷''' if self.root == None: return cur = self.root q = [cur] while q: cur = q.pop(0) print(cur.item) if cur.left: q.append(cur.left) if cur.right: q.append(cur.right)