樹的詳解及python實現

2021-10-21 04:41:58 字數 4814 閱讀 4568

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...