【數據結構與算法】002—樹與二叉樹(Python)

概念

樹是一類重要的非線性數據結構,是以分支關係定義的層次結構node

定義:python

樹(tree)是n(n>0)個結點的有限集T,其中: 有且僅有一個特定的結點,稱爲樹的根(root)數據結構

當n>1時,其他結點可分爲m(m>0)個互不相交的有限集T1,T2,……Tm,其中每個集合自己又是一棵樹,稱爲根的子樹(subtree)app

特色: 樹中至少有一個結點——根 樹中各子樹是互不相交的集合rest

基本術語code

  • 結點(node)——表示樹中的元素,包括數據項及若干指向其子樹的分支blog

  • 結點的度(degree)——結點擁有的子樹數 葉子(leaf)——度爲0的結點it

  • 孩子(child)——結點子樹的根稱爲該結點的孩子class

  • 雙親(parents)——孩子結點的上層結點叫該結點的~二叉樹

  • 兄弟(sibling)——同一雙親的孩子

  • 樹的度——一棵樹中最大的結點度數

  • 結點的層次(level)——從根結點算起,根爲第一層,它的孩子爲第二層……

  • 深度(depth)——樹中結點的最大層次數

  • 森林(forest)——m(m0)棵互不相交的樹的集合



二叉樹

二叉樹是有限個元素的集合,該集合或者爲空、或者有一個稱爲根節點(root)的元素及兩個互不相交的、分別被稱爲左子樹和右子樹的二叉樹組成。

  • 二叉樹的每一個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
  • 二叉樹的第i層至多有2^{i-1}個結點
  • 深度爲k的二叉樹至多有2^k-1個結點;
  • 對任何一棵二叉樹T,若是其終端結點數爲N0,度爲2的結點數爲N2,則N0=N2+1

遍歷二叉樹

  • 前序遍歷
    若樹爲空,則空操做返回。不然,先訪問根節點,而後前序遍歷左子樹,再前序遍歷右子樹。(W)型 (中 左 右)
  • 中序遍歷
    若樹爲空,則空操做返回。不然,從根節點開始(注意並非先訪問根節點),中序遍歷根節點的左子樹,而後是訪問根節點,最後中序遍歷根節點的右子樹。(M)型,(左 中 右)
  • 後續遍歷
    若樹爲空,則空操做返回。不然,從左到右先葉子後節點的方式遍歷訪問左右子樹,最後訪問根節點。(左右中)逆時針型 (左 右 中)
  • 層序遍歷
    若樹爲空,則空操做返回。不然,從樹的第一層,也就是根節點開始訪問,從上到下逐層遍歷,在同一層中,按從左到右的順序結點逐個訪問。


實現方法

class Node:  
    def __init__(self,value=None,left=None,right=None):  
        self.value=value  
        self.left=left    #左子樹
        self.right=right  #右子樹

def preTraverse(root, res=[]):  
    '''
    前序遍歷
    '''
    if root==None:  
        return 
    res.append(root.value)
    preTraverse(root.left, res)  
    preTraverse(root.right, res)  
    return res

def midTraverse(root, res=[]): 
    '''
    中序遍歷
    '''
    if root==None:  
        return  
    midTraverse(root.left, res)  
    res.append(root.value)
    midTraverse(root.right)  
    return res
  
def afterTraverse(root, res=[]):  
    '''
    後序遍歷
    '''
    if root==None:  
        return  
    afterTraverse(root.left)  
    afterTraverse(root.right)  
    res.append(root.value)
    return res

def traverse(root, res=[]):  
    '''
    層次遍歷
    '''
    if root==None:  
        return 
    delroot = [root]
    while delroot:
        current = delroot.pop(0)
        res.append(current.value)
        if current.left:
            delroot.append(current.left)
        if current.right:
            delroot.append(current.right)
    return res


if __name__=='__main__':
    root=Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'))))
    print('前序遍歷:')
    print(preTraverse(root))
    print('中序遍歷:')
    print(midTraverse(root))
    print('後序遍歷:')
    print(afterTraverse(root))
    print('層次遍歷:')
    print(traverse(root))
前序遍歷:
['D', 'B', 'A', 'C', 'E', 'G', 'F']
中序遍歷:
['A', 'B', 'C', 'D', 'E', 'F', 'G']
後序遍歷:
['A', 'C', 'B', 'F', 'G', 'E', 'D']
層次遍歷:
['D', 'B', 'E', 'A', 'C', 'G', 'F']
相關文章
相關標籤/搜索