Tree 樹形結構


一、樹的基本概念

(1)樹(Tree)的概念:樹是一種遞歸定義的數據結構,是一種重要的非線性數據結構。

       樹可以是一棵空樹,它沒有任何的結點;也可以是一棵非空樹,至少含有一個結點。

(2)根(Root):有且僅有一個結點的非空樹,那個結點就是根。

(3)子樹(Subtree):在一棵非空樹中,除根外,其余所有結點可以分為m(m≥0)個互不相交的集合。每個集合本身又是一棵樹,稱為根的子樹。

(4)結點(Node):表示樹中的元素及若干指向其子樹的分支。

(5)結點的度(Degree):一個結點擁有的子樹數目稱為該結點的度。

(6)葉子結點(Leaf):度為0的結點。

(7)孩子(Child):結點子樹的根稱為該結點的孩子。

(8)雙親(Parents):孩子結點的上層結點叫該結點的雙親。

(9)兄弟(Sibling):同一雙親的孩子。

(10)樹的度:一棵樹中最大的結點度數。

(11)結點的層次(Level):從根結點開始定義根為第一層,它的孩子為第二層,依此類推。

(12)深度(Depth):樹中結點最大層次的值。

(13)有序樹:樹中的各子樹自左向右有序的稱為有序樹。

(14)無序樹:樹中的各子樹自左向右無序的稱為無序樹。

(15)森林(Forest):是m(m≥0)棵互不相交的樹的集合。

(16)祖先:是指從根結點到該結點之間所有的結點。

 

如圖所示:

 

A是根結點,A結點的度是3,D結點的度是3;因為3是結點的度的最大值,所以這棵樹的度是3;E、G、H、I、K、L和M是葉子結點。

A在樹的第一層,B、C、D在樹的第二層,E、F、G、H、I、J在樹的第三層,K、L、M在樹的第四層;樹的深度是4。

樹從左往右是有序的,這是一棵有序樹;E結點的祖先是A、B。
 

 

二 二叉樹

   概念:二叉樹又叫二分樹,它的特點是每個結點最多只有二棵子樹,也就是二叉樹中沒有度大於2的結點。二叉樹的子樹有左右之分,嚴格區分左孩子、右孩子,其次序不能顛倒。

滿二叉樹

   概念:一棵深度為k且有2k-1個結點的二叉樹稱為滿二叉樹。

完全二叉樹

  概念:可以對滿二叉樹的結點進行連續編號,約定編號從根結點起,自上而下,自左至右。由此可以引出完全二叉樹的定義。深度為k的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應,稱之為完全二叉樹。

  完全二叉樹的特點是:

  (1)葉子結點只可能在層次最大的兩層上出現;(2)對任一結點,若其右分支下的子孫的最大層次為l,則其左分支下的子孫的最大層次必為l或l+1。

 

 三 性質

  性質1: 在二叉樹的第i層上至多有2i-1個結點(i>=1)

  性質2: 深度為k的二叉樹至多有2k-1個結點,(k>=1).

  性質3: 對任何一棵二叉樹T,如果其終端結點數位n0,度為2的結點數為n2,則 n0 = n2 + 1

  性質4: 具有n個結點的完全二叉樹的深度為 ⌊log2n⌋+1  

  性質5: 如果對一棵有n個結點的完全二叉樹(其深度為 ⌊log2n⌋+1 )的結點按層序編號(從第1層到第 ⌊log2n⌋+1 層,每層從左到右),則對任一結點i(1<=i<=n),有:

    (1)如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親PARENT(i)是結點⌊i/2⌋。

    (2)如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子LCHILD(i)是結點2i。

    (3)如果2i+1>n,則結點i無右孩子;否則其右孩子RCHILD(i)是結點2i+1。

四 python 代碼

 代碼

class Node:
    "定義節點類"
    def __init__(self,item):
        self.item=item
        self.lchild=None
        self.rchild=None

class Tree:
    "定義樹類"
    def __init__(self):
        self.root=None

    def add(self,item):
        node=Node(item)
        if not self.root:
            self.root=node
            return
        queue=[self.root,]
        while queue:
            current_node=queue.pop(0)
            if current_node.lchild is None:
                current_node.lchild=node
                return
            else:
                queue.append(current_node.lchild)
            if current_node.rchild is None:
                current_node.rchild=node
                return
            else:
                queue.append(current_node.rchild)
    def breadth_travel(self):
        '''廣度遍歷'''
        if self.root is None:
            return
        queue=[self.root,]

        while queue:
            current_node=queue.pop(0)
            print(current_node.item,end=" ")
            if current_node.lchild is not None:
                queue.append(current_node.lchild)
            if current_node.rchild is not None:
                queue.append(current_node.rchild)

    def preorder(self,node):
        '''先序遍歷----根->左->右'''
        if node is None:
            return
        print(node.item,end=" ")
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self,node):
        '''中序遍歷----左->中->右'''
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.item,end=" ")
        self.inorder(node.rchild)

    def postorder(self,node):
        '''后序遍歷----左->右->中'''
        if node is None:
            return
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.item,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('\n-----深度先序遍歷-----')
    tree.preorder(tree.root)
    print('\n-----深度中序遍歷-----')
    tree.inorder(tree.root)
    print('\n-----深度后序遍歷-----')
    tree.postorder(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 

 

 好文推薦

原文:https://blog.csdn.net/tfygg/article/details/46763389

原文:https://blog.csdn.net/gavin_john/article/details/72312276 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM