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

概述

  • 前言
  • 什麼是樹
  • 什麼是二叉樹
  • 深度優先
  • 廣度優先
  • 後記

前言

前面說到算法被虐了,這回我要好好把它啃下來。哪裏跌倒就要從哪裏站起來。這是我複習算法與數據結構時的小筆記,這裏就 po 出來,給你們也複習一下舊的知識點,查缺補漏。若是個人文章對你有幫助,歡迎關注、點贊、轉發,這樣我會更有動力作原創分享。node

什麼是樹

一棵樹

在計算器科學中,(英語:tree)是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具備層次關係的集合。mysql

樹的特色

  • 每一個節點有零個或多個子節點;
  • 沒有父節點的節點稱爲根節點;
  • 每個非根節點有且只有一個父節點;
  • 除了根節點外,每一個子節點能夠分爲多個不相交的子樹

術語

  • 節點的度:一個節點含有的子樹的個數稱爲該節點的度;
  • 樹的度:一棵樹中,最大的節點的度稱爲樹的度;
  • 葉節點或終端節點:度爲零的節點;
  • 非終端節點或分支節點:度不爲零的節點;
  • 父親節點或父節點:若一個節點含有子節點,則這個節點稱爲其子節點的父節點;
  • 孩子節點或子節點:一個節點含有的子樹的根節點稱爲該節點的子節點;
  • 兄弟節點:具備相同父節點的節點互稱爲兄弟節點;
  • 節點的層次:從根開始定義起,根爲第1層,根的子節點爲第2層,以此類推;
  • 深度:對於任意節點n,n的深度爲從根到n的惟一路徑長,根的深度爲0;
  • 高度:對於任意節點n,n的高度爲從n到一片樹葉的最長路徑長,全部樹葉的高度爲0;
  • 堂兄弟節點:父節點在同一層的節點互爲堂兄弟;
  • 節點的祖先:從根到該節點所經分支上的全部節點;
  • 子孫:以某節點爲根的子樹中任一節點都稱爲該節點的子孫。
  • 森林:由m(m>=0)棵互不相交的樹的集合稱爲森林;

什麼是二叉樹

二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹; 徹底二叉樹:對於一顆二叉樹,假設其深度爲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」,關注公衆號獲取最新推文,後臺回覆【國慶指數】獲取源碼。

相關文章
相關標籤/搜索