python 實現二叉樹的深度 & 廣度優先遍歷


什么是樹

在計算器科學中,(英語: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM