數據結構-03-二叉樹(Binary Tree)

###Binary Tree - 二叉樹 二叉樹是每一個節點最多有兩個子樹的樹結構,子樹有左右之分,二叉樹常被用於實現二叉查找樹和二叉堆。數組

學二叉樹,先來明確兩個概念,何爲二叉樹的度和深度?
二叉樹結點的度數指該結點所含子樹的個數,二叉樹結點子樹個數最多的那個結點的度爲二叉樹的度。
二叉樹的根結點所在的層數爲1,根結點的孩子結點所在的層數爲2,以此下去。深度是指全部結點中最深的結點所在的層數。app

輸入圖片說明

示例:post

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None

##樹的遍歷 從二叉樹的根節點出發,節點的遍歷分爲三個主要步驟對當前節點進行操做(稱爲「訪問」節點,或者根節點)、遍歷左邊子節點、遍歷右邊子節點。訪問節點順序的不一樣也就造成了不一樣的遍歷方式。須要注意的是樹的遍歷一般使用遞歸的方法進行理解和實現,在訪問元素時也須要使用遞歸的思想去理解。實際實現中對於前序中序遍歷可嘗試使用遞歸實現。code

按照訪問根元素(當前元素)的先後順序,遍歷方式可劃分爲以下幾種:遞歸

  • 深度優先:先訪問子節點,再訪問父節點,最後訪問第二個子節點。根據根節點相對於左右子節點的訪問前後順序又可細分爲如下三種方式。
    1.前序(pre-order):先根後左再右
    2.中序(in-order):先左後根再右
    3.後序(post-order):先左後右再根
  • 廣度優先:先訪問根節點,沿着樹的寬度遍歷子節點,直到全部節點均被訪問爲止。
    以下圖所示,遍歷順序在右側框中,紅色A爲根節點。使用遞歸和總體的思想去分析遍歷順序較爲清晰。

輸入圖片說明

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None

class Traversal(object):
    def __init__(self):
        self.traverse_path = list()

    def preorder(self, root):
        if root:
            self.traverse_path.append(root.val)
            self.preorder(root.left)
            self.preorder(root.right)

    def inorder(self,root):
        if root:
            self.inorder(root.left)
            self.traverse_path.append(root.val)
            self.inorder(root.right)

    def postorder(self,root):
        if root:
            self.postorder(root.left)
            self.postorder(root.right)
            self.traverse_path.append(root.val)

二叉樹的廣度優先遍歷和樹的前序/中序/後序遍歷不太同樣,前/中/後序遍歷使用遞歸,也就是的思想對二叉樹進行遍歷,廣度優先通常使用隊列的思想對二叉樹進行遍歷隊列

若是已知中序遍歷和前序遍歷或者後序遍歷,那麼就能夠徹底恢復出原二叉樹結構。其中最爲關鍵的是前序遍歷中第一個必定是根,然後序遍歷最後一個必定是根,中序遍歷在得知根節點後又可進一步遞歸得知左右子樹的根節點。可是這種方法也是有適用範圍的:元素不能重複!不然沒法完成定位。圖片

##樹類題的複雜度分析 對樹相關的題進行復雜度分析時可統計對每一個節點被訪問的次數,進而求得總的時間複雜度。it

###Binary Search Tree - 二叉查找樹 一顆二叉查找樹(BST)是一顆二叉樹,其中每一個節點都含有一個可進行比較的鍵及相應的值,且每一個節點的鍵都大於等於左子樹中的任意節點的鍵,而小於右子樹中的任意節點的鍵。class

使用中序遍歷可獲得有序數組,這是二叉查找樹的又一個重要特徵。object

二叉查找樹使用的每一個節點含有兩個連接,它是將鏈表插入的靈活性和有序數組查找的高效性結合起來的高效符號表實現。

相關文章
相關標籤/搜索