1. 程式人生 > >利用python實現二叉樹

利用python實現二叉樹

樹的基本概念

- 樹的節點不能形成迴路

- 森林是由多個數組成

樹形結構的專有名詞介紹

  • 度數:每一個節點的所有子樹的個數
  • 層數:樹的層數
  • 高度:樹的最大層數
  • 樹葉或終端節點:度數為零的節點
  • 父節點:與這個節點有連結的上一層節點
  • 子節點:每一個節點有連結的下一個節點
  • 祖先和子孫: 祖先:從樹根到該節點路勁上所包含的節點;子孫:該節點往下追溯的任一節點
  • 兄弟節點: 有共同父節點的節點為兄弟節點
  • 非終端節點:樹葉以外的節點
  • 同代:在同一棵樹中具有相同層數的節點

二叉樹

計算機儲存樹形結構一般是連結串列形式為主的。

定義:

* 二叉樹最多隻有兩個子節點,每一個節點的度數小於等於2.

二叉樹的特點:

  • 樹不可以為空集
  • 樹的度數為d>= 0 ,但二叉樹的節點的度數 0 d 2 0\leqslant d \leqslant 2
  • 樹的子樹沒有次序,二叉樹有。左子樹,右子樹
  • 高度為k的二叉樹的總結點樹是$ 2^{k}-1$
  • 對於任意非空的二叉樹T,如果 n 0 n_{0} 為樹葉節點,且度數為2的節點數是 n
    2 n_{2}
    , n 0 = n 2 + 1 n_{0} = n_{2} + 1
  • 在二叉樹中,層數(Level)為i的節點數最多是 2 i 1 ( i 0 ) 2^{i-1}(i\geqslant0)

特殊的二叉樹

滿二叉樹

  • 對於二叉樹的高度為h,樹的節點數為$ 2^{n} - 1$

完全二叉樹

  • 如果二叉樹的高度為h,樹的節點數小於$ 2^{n} - 1$,編號方式與滿二叉樹相同,從上到下,從左到右。

斜二叉樹

  • 一個二叉樹完全沒有左節點或者右節點

嚴格二叉樹

  • 二叉樹的每一個非終端節點都有左右子樹。

二叉樹的儲存方式

一維陣列表示法

  • 左子樹的索引值是父節點的索引值 × 2 + 1 \times 2 + 1
  • 右子樹的索引值是父節點的索引值 × 2 + 2 \times 2 + 2

二叉查詢樹

  • 每一個樹根的值需要大於左子樹的值
  • 每一個樹根的值需要小於右子樹的值
  • 左右子樹也是二叉查詢樹
  • 樹的每一個節點的值都不相同

建立一個二叉查詢樹

def Btree_create(btree,data,length):
    for i in range(length):
        level = 0
        while btree[level] != None:
            if data[i] > btree[level]:
                level = level * 2+2
            else:
                level = level = level*2+1
        btree[level] = data[i]
length = 8
data = [6,3,5,4,7,8,9,2]
btree = [None]*15
print('原始陣列內容')
for i in range(length):
    print('[%2d]' % data[i],end = ' ')
print(' ')
Btree_create(btree,data,8)
print('二叉樹內容:')
for i in range(15):
    print('[{}]'.format(btree[i]),end = ' ')
print()

        
原始陣列內容
[ 6] [ 3] [ 5] [ 4] [ 7] [ 8] [ 9] [ 2]  
二叉樹內容:
[6] [3] [7] [2] [5] [None] [8] [None] [None] [4] [None] [None] [None] [None] [9] 

二叉樹的連結串列表示方法

#節點類
class tree:
    
    def __init__(self):
        self.data = 0
        self.left = None
        self.right = None

#以連結串列的方式建立二叉樹
def create_tree(root,val): 
    newnode = tree()
    newnode.data = val
    newnode.left = None
    newnode.right = None
    if root == None:
        root = newnode
        return root
    else:
        current = root
        while current != None:
            backup = current
            if current.data > val
                current = current.left
            else:
                current = current.right
        if backup.data > val:
            backup.left = newnode
        else:
            backup.right = newnode
        return root
    

按照順序輸入一個二叉樹有十個節點,分別是[5,6,24,8,12,3,17,1,9]

class tree:
    
    def __init__(self):
        self.data = 0
        self.left = None
        self.right = None

        
def create_tree(root,val): 
    newnode = tree()
    newnode.data = val
    newnode.left = None
    newnode.right = None
    if root == None:
        root = newnode
        return root
    else:
        current = root
        while current != None:
            backup = current
            if current.data > val:
                current = current.left
            else:
                current = current.right
        if backup.data > val:
            backup.left = newnode
        else:
            backup.right = newnode
        return root
    
data = [5,6,24,8,12,3,17,1,9]
ptr = None
root = None
for i in range(9):
    ptr = create_tree(ptr,data[i])

print('左子樹')

root = ptr.left
while root != None:
    print('%d' % root.data)
    root = root.left
print('--------------------------------------')
print('右子樹')
root = ptr.right

while root != None:
    print('%d' % root.data)
    root = root.right
print()

左子樹
3
1
--------------------------------------
右子樹
6
24