樹(英語:tree)是一種抽象數據類型(ADT)或是實做這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>=1)個有限節點組成一個具備層次關係的集合。node
特色:每一個節點有另個或者多個節點;沒有父節點的節點分爲根節點;每一個非根節點只有一個父節點;除了根節點外,每一個子節點能夠分爲多個不相交的子樹;數據結構
相關術語app
樹種類:ide
無序樹:樹中任意節點的子節點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;優化
有序樹:樹中任意節點的子節點之間有順序關係,這種樹稱爲有序樹;編碼
二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;spa
霍夫曼樹(用於信息編碼):帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹;給定n個權值做爲n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹爲最優二叉樹,也稱爲哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。code
B樹:一種對讀寫操做進行優化的自平衡的二叉查找樹,可以保持數據有序,擁有多餘兩個子樹。blog
二叉樹定義:二叉樹是每一個結點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。排序
二叉樹性質
二叉樹的遍歷,
先序遍歷:遍歷順序規則爲【根左右】
中序遍歷:遍歷順序規則爲【左根右】
後序遍歷:遍歷順序規則爲【左右根】
代碼實現
# Author:song 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) print('') 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 posorder(self,node): """後序遍歷""" if node is None: return self.posorder(node.lchild) self.posorder(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) print('廣度優先:') tree.breadth_travel() print('先序遍歷:') tree.preorder(tree.root) print('') print('中序遍歷:') tree.inorder(tree.root) print('') print('後序遍歷:') tree.posorder(tree.root) 結果: 廣度優先: 0,1,2,3,4,5,6,7,8,9, 先序遍歷: 0,1,3,7,8,4,9,2,5,6, 中序遍歷: 7,3,8,1,9,4,0,5,2,6, 後序遍歷: 7,8,3,9,4,1,5,6,2,0,
經過兩個序列能夠肯定一棵樹,其中一定有中序,只給先序後序沒法肯定一棵樹。