###Binary Tree - 二叉樹 二叉樹是每一個節點最多有兩個子樹的樹結構,子樹有左右之分,二叉樹常被用於實現二叉查找樹和二叉堆。數組
學二叉樹,先來明確兩個概念,何爲二叉樹的度和深度?
二叉樹結點的度數指該結點所含子樹的個數,二叉樹結點子樹個數最多的那個結點的度爲二叉樹的度。
二叉樹的根結點所在的層數爲1,根結點的孩子結點所在的層數爲2,以此下去。深度是指全部結點中最深的結點所在的層數。app
示例:post
class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None
##樹的遍歷 從二叉樹的根節點出發,節點的遍歷分爲三個主要步驟:對當前節點進行操做(稱爲「訪問」節點,或者根節點)、遍歷左邊子節點、遍歷右邊子節點。訪問節點順序的不一樣也就造成了不一樣的遍歷方式。須要注意的是樹的遍歷一般使用遞歸的方法進行理解和實現,在訪問元素時也須要使用遞歸的思想去理解。實際實現中對於前序和中序遍歷可嘗試使用遞歸實現。code
按照訪問根元素(當前元素)的先後順序,遍歷方式可劃分爲以下幾種:遞歸
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
二叉查找樹使用的每一個節點含有兩個連接,它是將鏈表插入的靈活性和有序數組查找的高效性結合起來的高效符號表實現。