什么是樹
在計算器科學中,樹(英語:tree)是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具有層次關系的集合。
樹的特點
每個節點有零個或多個子節點;
沒有父節點的節點稱為根節點;
每一個非根節點有且只有一個父節點;
除了根節點外,每個子節點可以分為多個不相交的子樹
概念
節點的度:一個節點含有的子樹的個數稱為該節點的度;
樹的度:一棵樹中,最大的節點的度稱為樹的度;
葉節點或終端節點:度為零的節點;
非終端節點或分支節點:度不為零的節點;
父親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點;
孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點;
兄弟節點:具有相同父節點的節點互稱為兄弟節點;
節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
深度:對於任意節點n,n的深度為從根到n的唯一路徑長,根的深度為0;
高度:對於任意節點n,n的高度為從n到一片樹葉的最長路徑長,所有樹葉的高度為0;
堂兄弟節點:父節點在同一層的節點互為堂兄弟;
節點的祖先:從根到該節點所經分支上的所有節點;
子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。
森林:由m(m>=0)棵互不相交的樹的集合稱為森林;
什么是二叉樹
二叉樹:每個節點最多含有兩個子樹的樹稱為二叉樹;
完全二叉樹:對於一顆二叉樹,假設其深度為d(d>1)。除了第d層外,其它各層的節點數目均已達最大值,且第d層所有節點從左向右連續地緊密排列,這樣的二叉樹被稱為完全二叉樹;

滿二叉樹:所有葉節點都在最底層的完全二叉樹;

深度優先
深度優先遍歷即是先按深度來遍歷二叉樹,包括:
前序遍歷
遍歷順序 --> 根節點 -> 左子樹 -> 右子樹中序遍歷
遍歷順序--> 左子樹 -> 根節點 -> 右子樹后序遍歷
遍歷順序--> 左子樹 -> 右子樹 -> 根節點
# 定義一個樹節點
class TreeNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left # 左子樹
self.right = right # 右子樹
# 實例化一個樹節點
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)
# 中序遍歷
def midTraverse(root):
if root is None:
return
midTraverse(root.left)
print(root.value)
midTraverse(root.right)
# 后序遍歷
def afterTraverse(root):
if root is None:
return
afterTraverse(root.right)
afterTraverse(root.left)
print(root.value)
if __name__ == "__main__":
preTraverse(node1)
print("------------------------")
midTraverse(node1)
print("------------------------")
afterTraverse(node1)
# 運行結果
----------前序遍歷--------------
A
B
D
E
C
F
G
----------中序遍歷--------------
D
B
E
A
F
C
G
----------后序遍歷--------------
G
F
C
E
D
B
A
廣度優先
廣度優先遍歷即是層次遍歷,按一層一層地遍歷。
def levelOrder(root):
# 如果根節點為空,則返回空列表
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)
print(r.value)
if __name__ == "__main__":
levelOrder(node1)
運行結果
A
B
C
D
E
F
G
