前面說到算法被虐了,這回我要好好把它啃下來。哪裏跌倒就要從哪裏站起來。這是我複習算法與數據結構時的小筆記,這裏就 po 出來,給你們也複習一下舊的知識點,查缺補漏。若是個人文章對你有幫助,歡迎關注、點贊、轉發,這樣我會更有動力作原創分享。node
在計算器科學中,樹(英語:tree)是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具備層次關係的集合。mysql
二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹; 徹底二叉樹:對於一顆二叉樹,假設其深度爲d(d>1)。除了第d層外,其它各層的節點數目均已達最大值,且第d層全部節點從左向右連續地緊密排列,這樣的二叉樹被稱爲徹底二叉樹; 面試
滿二叉樹:全部葉節點都在最底層的徹底二叉樹; 算法
深度優先遍歷便是先按深度來遍歷二叉樹,包括:sql
前序遍歷
遍歷順序 --> 根節點 -> 左子樹 -> 右子樹數據庫
中序遍歷
遍歷順序--> 左子樹 -> 根節點 -> 右子樹性能優化
後序遍歷
遍歷順序--> 左子樹 -> 右子樹 -> 根節點bash
首先,定義 TreeNode:數據結構
class TreeNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left # 左子樹
self.right = right # 右子樹
複製代碼
實例化一個 TreeNode:app
node1 = TreeNode("A",
TreeNode("B",
TreeNode("D"),
TreeNode("E")
),
TreeNode("C",
TreeNode("F"),
TreeNode("G")
)
)
複製代碼
def preTraverse(root):
if root is None:
return
print(root.value)
preTraverse(root.left)
preTraverse(root.right)
複製代碼
運行結果:
A
B
D
E
C
F
G
複製代碼
def midTraverse(root):
if root is None:
return
midTraverse(root.left)
print(root.value)
midTraverse(root.right)
複製代碼
運行結果:
D
B
E
A
F
C
G
複製代碼
def afterTraverse(root):
if root is None:
return
afterTraverse(root.left)
afterTraverse(root.right)
print(root.value)
複製代碼
運行結果:
D
E
B
F
G
C
A
複製代碼
廣度優先遍歷便是層次遍歷,按一層一層地遍歷。
def levelOrder(root):
# write your code here
res = []
# 若是根節點爲空,則返回空列表
if root is None:
return res
# 模擬一個隊列儲存節點
q = []
# 首先將根節點入隊
q.append(root)
# 列表爲空時,循環終止
while len(q) != 0:
length = len(q)
for i in range(length):
# 將同層節點依次出隊
r = q.pop(0)
if r.left is not None:
# 非空左孩子入隊
q.append(r.left)
if r.right is not None:
# 非空右孩子入隊
q.append(r.right)
res.append(r.value)
print(r.value)
return res
複製代碼
運行結果:
A
B
C
D
E
F
G
複製代碼
此次複習先是到這裏了。這裏嘮叨一下,數據結構與算很重要,不少東西的實現都少不了數據結構與算法,就如 mysql 的實現就用到了 B+ 樹,若是咱們懂其中的原理,對數據庫性能優化會有很大的幫助。還有一點比較重要的是,大廠的面試確定少不了算法與數據結構。想進大廠?仍是乖乖滴學通算法。
本篇文章首發於公衆號「zone7」,關注公衆號獲取最新推文,後臺回覆【國慶指數】獲取源碼。