利用python實現二叉樹
阿新 • • 發佈:2018-12-28
樹的基本概念
- 樹的節點不能形成迴路
- 森林是由多個數組成
樹形結構的專有名詞介紹
- 度數:每一個節點的所有子樹的個數
- 層數:樹的層數
- 高度:樹的最大層數
- 樹葉或終端節點:度數為零的節點
- 父節點:與這個節點有連結的上一層節點
- 子節點:每一個節點有連結的下一個節點
- 祖先和子孫: 祖先:從樹根到該節點路勁上所包含的節點;子孫:該節點往下追溯的任一節點
- 兄弟節點: 有共同父節點的節點為兄弟節點
- 非終端節點:樹葉以外的節點
- 同代:在同一棵樹中具有相同層數的節點
二叉樹
計算機儲存樹形結構一般是連結串列形式為主的。
定義:
* 二叉樹最多隻有兩個子節點,每一個節點的度數小於等於2.
二叉樹的特點:
- 樹不可以為空集
- 樹的度數為d>= 0 ,但二叉樹的節點的度數
- 樹的子樹沒有次序,二叉樹有。左子樹,右子樹
- 高度為k的二叉樹的總結點樹是$ 2^{k}-1$
- 對於任意非空的二叉樹T,如果 為樹葉節點,且度數為2的節點數是 ,
- 在二叉樹中,層數(Level)為i的節點數最多是
特殊的二叉樹
滿二叉樹
- 對於二叉樹的高度為h,樹的節點數為$ 2^{n} - 1$
完全二叉樹
- 如果二叉樹的高度為h,樹的節點數小於$ 2^{n} - 1$,編號方式與滿二叉樹相同,從上到下,從左到右。
斜二叉樹
- 一個二叉樹完全沒有左節點或者右節點
嚴格二叉樹
- 二叉樹的每一個非終端節點都有左右子樹。
二叉樹的儲存方式
一維陣列表示法
- 左子樹的索引值是父節點的索引值
- 右子樹的索引值是父節點的索引值
二叉查詢樹
- 每一個樹根的值需要大於左子樹的值
- 每一個樹根的值需要小於右子樹的值
- 左右子樹也是二叉查詢樹
- 樹的每一個節點的值都不相同
建立一個二叉查詢樹
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