1.樹不是線性結構,是非線性的。
2.樹在電腦科學裡應用廣泛,包括作業系統,圖形學,資料庫和計算機網路等。
3.數的術語:
·節點
· 樹中的每乙個元素稱為乙個節點,節點是樹的基本組成部分。
· 邊 · 邊也是樹的基本構成部分,邊有方向,連線兩節節點,並表示他們之間的聯絡。
· 除了根節點外每個節點都有且有一條與其他節點相連的入邊,每個節點有多個出邊
· 根節點
· 根節點是樹中唯一乙個沒有入邊的節點
4.樹的定義:
樹是節點和連線節點的邊的集合,它有以下特徵:
·有乙個根節點
·除了根節點,每乙個節點都有一條邊與父節點相連
·可以沿著唯一的路徑從根節點到每個節點
·如果這個樹的每個節點都有至多兩個子節點,稱為二叉樹
5.二叉樹的定義:
· 二叉樹是由n(n>=0)個節點組成的有限集合,每個節點最多有兩個子樹,它或者是空集,或者是由乙個根和左右的兩個不相交的二叉樹組成
· 節點的度和樹的度
· 每個節點具有的子樹個數叫節點的度,所有節點的度的最大值稱為樹的度
· 二叉樹的度為2
6.二叉樹的特點:
· 二叉樹是有序樹,即使只有乙個子樹,也必須區分左右子樹
· 二叉樹的每個節點的度不能大於2
· 二叉樹中所有節點的形態有5種:空節點,無左右子樹的節點,只有左子樹的節點,只有右子樹,左右子樹都有
7.滿二叉樹是完全二叉樹的特例
8.二叉樹的遍歷:
· 按照一定次序訪問樹中所有節點,並且每個節點的值僅被訪問一次的過程
· 可能的三種遍歷次序:
· 先序遍歷: vlr
· 中序遍歷: lvr
· 後序遍歷: lrv
9.列表實現二叉樹的遍歷:
mytree =
['a',
['b',
['d',[
],], [
'e',[
],], ],
['c',
['f',[
],], [
], ]
]print(
'root=',mytree[0]
)print(
'left tree=',mytree[1]
)print(
'right tree=',mytree[2]
)結果:
root= a
left tree=
['b', [
'd', [
], [
]], [
'e', [
], ]
]right tree=
['c', [
'f', [
], [
]], [
]]
10.構建二叉樹**實現:
def bin_tree(r):
return
[r,[
],]def insert_left(root,new_brach):
t = root.pop(1)
if len(t)
> 1:
root.insert(1,[new_brach,t,]
) else:
root.insert(1,[new_brach,[
],])
return root
def insert_right(root,new_brach):
t = root.pop(2)
if len(t)
> 1:
root.insrt(2,[new_brach,[
],t]
) else:
root.insert(2,[new_brach,[
],])
return root
def get_root(root):
return root[0]
def set_root(root,new_root):
root[0]
= new_root
def get_left_tree(root):
return root[1]
def get_right_left(root):
return root[2]
tree = bin_tree(
'a')
insert_left(tree,'b'
)insert_right(tree,'c'
)insert_left(get_left_tree(tree),'d'
)insert_right(get_left_tree(tree),'e'
)insert_left(get_right_left(tree),'f'
)print(tree)
結果:[
'a', [
'b', [
'd', [
], [
]], [
'e', [
], ]
], [
'c', [
'f', [
], [
]], ]
]
11.二叉樹的先序遍歷
def func_vlr(tree):
if tree !=:
print(tree[0],end='')
func_vlr(tree[1]
) func_vlr(tree[2]
)func_vlr(tree)
12.二叉樹的中序遍歷
def func_lvr(tree):
if tree !=:
func_lvr(tree[1]
) print(tree[0],end='')
func_lvr(tree[2]
)func_lvr(tree)
13.計算二叉樹節點的個數
def count_func(tree):
if tree ==:
return 0
n1 = count_func(tree[1]
) n2 = count_func(tree[2]
) res = 1+n1+n2
return res
print(count_func(tree))
14.二叉排序樹的定義:
· 要麼是一顆空樹
· 如果不為空,那麼其左子樹節點的值都小於根節點的值,右子節點的值都大於根節點的值
· 左右子樹也是二叉排序樹
15.判斷二叉樹中是否有某個數
def serach_tree(tree,num):
if tree ==:
return false
if num == tree[0]:
return true
elif num < tree[0]:
return serach_tree(tree[1],num)
elif num > tree[0]:
return serach_tree(tree[2],num)
16.二叉樹插入乙個數:
def insert_tree(tree,num):
if tree ==:
tree.extend(
[num,[
],])
elif num <=tree[0]:
insert_tree(tree[1],num)
elif num > tree[0]:
insert_tree(tree[2],num)
17.查詢二叉搜尋樹的最大值:
def getmax(tree):
if tree[2]==[
]: x = tree[0]
if tree[1]!=[
]: tree[:]
= tree[1]
else:
tree.clear(
)return x
else:
return getmax(tree[2]
)
18.二叉搜尋樹刪除乙個數
def delete(tree,num):
if tree ==:
return false
if num < tree[0]:
return delete(tree[1],num)
elif num > tree[0]:
return delete(tree[2],num)
else:
if tree[1]==[
] and tree[2]==[
]: tree.clear(
)elif tree[1]==[
]: tree[:]
= tree[2]
elif tree[2]==[
] tree[:]
= tree[1]
else:
max = getmax(tree[1]
) tree[0]
= max
return true
SVM演算法原理詳解及python實現
w tx b 0 quad y i 1 longleftrightarrow y x i 0 w tx b 0 quad y i 1 longleftrightarrow y x i 0 end 幾何間距 longleftrightarrow frac 函式間隔 w wtx b 幾何間距 w y i...
KNN原理及python實現 kd樹
覺得自己完全看懂和做出來是兩回事,希望自己可以堅持將機器學習演算法基本都復現出來,並有時間進行時間空間複雜度的優化,用matlab梳理完思路後有時間再用python寫一遍,畢竟我是乙個厲害的小女子哈哈哈。如果你閱讀我的文章有什麼疑問,或是任何學術討論,歡迎和我交流 ianqi1994 163.com...
樹的python實現
from collections import deque import queue class treenode def init self,x self.val x self.left none self.right none class tree object docstring for tr...