樹(英語:tree)是一種抽象數據類型(ADT)或是實做這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>=1)個有限節點組成一個具備層次關係的集合。把它叫作「樹」是由於它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。html
二叉樹一般鏈式存儲node
1.xml,html等,那麼編寫這些東西的解析器的時候,不可避免用到樹
2.路由協議就是使用了樹的算法
3.mysql數據庫索引
4.文件系統的目錄結構
5.因此不少經典的AI算法其實都是樹搜索,此外機器學習中的decision tree也是樹結構python
二叉樹是每一個節點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtreemysql
性質1: 在二叉樹的第i層上至多有2^(i-1)個結點(i>0)
性質2: 深度爲k的二叉樹至多有2^k - 1個結點(k>0)
性質3: 對於任意一棵二叉樹,若是其葉結點數爲N0,而度數爲2的結點總數爲N2,則N0=N2+1;
性質4:具備n個結點的徹底二叉樹的深度必爲 log2(n+1)
性質5:對徹底二叉樹,若從上至下、從左至右編號,則編號爲i 的結點,其左孩子編號必爲2i,其右孩子編號必爲2i+1;其雙親的編號必爲i/2(i=1 時爲根,除外)算法
廣度優先遍歷sql
通常使用隊列queue數據庫
深度優先遍歷數據結構
深度優先搜索(Depth First Search)是沿着樹的深度遍歷樹的節點,儘量深的搜索樹的分支。app
三種方法 先序遍歷(preorder),中序遍歷(inorder)和後序遍歷(postorder)機器學習
先序遍歷 根-左-右
在先序遍歷中,咱們先訪問根節點,而後遞歸使用先序遍歷訪問左子樹,再遞歸使用先序遍歷訪問右子樹 根節點->左子樹->右子樹
中序遍歷 左-根-右
中序遍歷 在中序遍歷中,咱們遞歸使用中序遍歷訪問左子樹,而後訪問根節點,最後再遞歸使用中序遍歷訪問右子樹
後序遍歷 左-右-根
後序遍歷 在後序遍歷中,咱們先遞歸使用後序遍歷訪問左子樹和右子樹,最後訪問根節點
class Node(object): def __init__(self,item): self.elem = item self.lchild = None self.rchild = None class Tree(object): """二叉樹""" def __init__(self): self.root = None def add(self,item): node = Node(item) if self.root is None: self.root = node return queue = [self.root] while queue: cur_node = queue.pop(0) if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) if cur_node.rchild is None: cur_node.rchild = node return else: queue.append(cur_node.rchild) def breadth_travel(self): """廣度遍歷""" if self.root is None: return queue = [self.root] while queue: cur_node = queue.pop(0) print(cur_node.elem, end="") if cur_node.lchild is not None: queue.append(cur_node.lchild) if cur_node.rchild is not None: queue.append(cur_node.rchild) def preorder(self,node): """先序遍歷""" if node is None: return print(node.elem, end = "") self.preorder(node.lchild) self.preorder(node.rchild) def inorder(self,node): """中序遍歷""" if node is None: return self.inorder(node.lchild) print(node.elem, end = "") self.inorder(node.rchild) def postorder(self,node): """先序遍歷""" if node is None: return self.postorder(node.lchild) self.postorder(node.rchild) print(node.elem, end = "") if __name__ == "__main__": tree = Tree() tree.add(0) tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breadth_travel() print("") tree.preorder(tree.root) print("") tree.inorder(tree.root) print("") tree.postorder(tree.root) print("")
根據遍歷畫出來樹
給定其中兩種,先序和中序 或者 中序和後序, 求樹
思路 以根爲中心
1.先序 和 中序
2.中序 和 後序