樹與樹算法

樹(英語:tree)是一種抽象數據類型(ADT)或是實做這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>=1)個有限節點組成一個具備層次關係的集合。node

特色:每一個節點有另個或者多個節點;沒有父節點的節點分爲根節點;每一個非根節點只有一個父節點;除了根節點外,每一個子節點能夠分爲多個不相交的子樹;數據結構

 相關術語app

  • 樹的結點(node):包含一個數據元素及若干指向子樹的分支;
  • 孩子結點(child node):結點的子樹的根稱爲該結點的孩子;
  • 雙親結點:B 結點是A 結點的孩子,則A結點是B 結點的雙親;
  • 兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;
  • 祖先結點: 從根到該結點的所經分支上的全部結點子孫結點:以某結點爲根的子樹中任一結點都稱爲該結點的子孫
  • 結點層:根結點的層定義爲1;根的孩子爲第二層結點,依此類推;
  • 樹的深度:樹中最大的結點層
  • 結點的度:結點子樹的個數
  • 樹的度: 樹中最大的結點度。
  • 葉子結點:也叫終端結點,是度爲 0 的結點;
  • 分枝結點:度不爲0的結點;
  • 有序樹:子樹有序的樹,如:家族樹;
  • 無序樹:不考慮子樹的順序;

 

樹種類:ide

無序樹:樹中任意節點的子節點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;優化

有序樹:樹中任意節點的子節點之間有順序關係,這種樹稱爲有序樹;編碼

二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;spa

  • 徹底二叉樹:對於一顆二叉樹,假設其深度爲d(d>1)。除了第d層外,其它各層的節點數目均已達最大值,且第d層全部節點從左向右連續地緊密排列,這樣的二叉樹被稱爲徹底二叉樹,其中滿二叉樹的定義是全部葉節點都在最底層的徹底二叉樹;
  •  

  • 平衡二叉樹(AVL樹):當且僅當任何節點的兩棵子樹的高度差不大於1的二叉樹;
  •  

  • 排序二叉樹(二叉查找樹(英語:Binary Search Tree),也稱二叉搜索樹、有序二叉樹);
  •  

霍夫曼樹(用於信息編碼):帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹;給定n個權值做爲n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹爲最優二叉樹,也稱爲哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。code

B樹:一種對讀寫操做進行優化的自平衡的二叉查找樹,可以保持數據有序,擁有多餘兩個子樹。blog

 

二叉樹定義:二叉樹是每一個結點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。排序

二叉樹性質

  • (1) 在非空二叉樹中,第i層的結點總數不超過  , i>=1;
  • (2) 深度爲h的二叉樹最多有  個結點(h>=1),最少有h個結點;
  • (3) 對於任意一棵二叉樹,若是其葉結點數爲N0,而度數爲2的結點總數爲N2,則N0=N2+1;
  • (4) 具備n個結點的徹底二叉樹的深度爲  (注:[ ]表示向下取整)
  • (5)有N個結點的徹底二叉樹各結點若是用順序方式存儲,則結點之間有以下關係:若I爲結點編號則 若是I>1,則其父結點的編號爲I/2;若是2*I<=N,則其左孩子(即左子樹的根結點)的編號爲2*I;若2*I>N,則無左孩子;若是2*I+1<=N,則其右孩子的結點編號爲2*I+1;若2*I+1>N,則無右孩子。
  • (6)給定N個節點,能構成h(N)種不一樣的二叉樹。h(N)爲卡特蘭數的第N項。h(n)=C(2*n,n)/(n+1)。
  • (7)設有i個枝點,I爲全部枝點的道路長度總和,J爲葉的道路長度總和J=I+2i

 

二叉樹的遍歷,

先序遍歷:遍歷順序規則爲【根左右】

中序遍歷:遍歷順序規則爲【左根右】

後序遍歷:遍歷順序規則爲【左右根】

 代碼實現

# 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,
View Code

 

經過兩個序列能夠肯定一棵樹,其中一定有中序,只給先序後序沒法肯定一棵樹。

相關文章
相關標籤/搜索