python演算法 樹的結構

2021-10-24 03:47:55 字數 3528 閱讀 4684

這一節比較重要,講述樹這種資料結構以及一些常用的知識和應用。樹這種結構,比 線性結構要複雜和靈活一點,所以可以實現更多的邏輯難題,相比於圖的話用的又更多一點,所以需要多多練習。

1、生物物種分類體系;

2、計算機裡面的檔案系統;

3、html文件裡面的巢狀標記

4、網域名稱體系;

1、節點node:裡面儲存著相應的資料值;

2、邊edge:每條邊連線兩個節點。具有出入方向,每個節點(除了根節點),有乙個入邊;

3、根root:沒有入邊的節點,在上面;

4、路徑path:由邊依次連線在一起的乙個列表

5、子節點:入邊來自於同一節點的,稱為這個節點的子節點;

6、父節點:有乙個出邊是所有連線節點的,是父節點;

7、兄弟節點:具有同乙個父節點的,之間稱為兄弟節點;

9、葉節點:沒有子節點的節點稱為葉節點;

10、層級:從根節點到達乙個節點的路徑包含的邊的數量。如根節點是0層,根的子節點是1層;

11、高度:樹中所有節點的最大層級稱為樹的高度;

一般的,習慣運用之前的鍊錶去表示我們的樹,為了快速理解和實現,我們主要研究二叉樹:

class

binarytree

:def

__init__

(self,rootobj)

: self.key=rootobj

self.left=

none

self.right=

none

definsertleft

(self,newobj)

:if self.left==

none

: self.left=binarytree(newobj)

else

: t=binarytree(newobj)

t.left=self.left

self.left=t

definsertright

(self,newobj)

:if self.right==

none

: self.right=binarytree(newobj)

else

: t=binarytree(newobj)

t.right=self.right

self.right=t

首先實現了幾個基本的點:

1、每個節點其實有三個內容,自身的值key,到左節點的鏈結left,和到右節點的鏈結right;

2、主要功能是–新增左節點和新增右節點:

3、按照正常思維,將新節點新增到葉子節點,就很複雜,需要確定很多引數;這裡選擇的是把新節點放到根的的下面節點,類似於乙個插入的概念。

(在以前的鍊錶章節,新增乙個新節點,其實也是用的這種思維)

下面實現了一些二叉樹的其他方法

def

getright

(self)

:return self.right

defgetleft

(self)

:return self.left

defsetrootobj

(self,obj)

: self.key=obj

defgetrootobj

(self)

:return self.key

主要就是獲取左右子樹,根節點數值,以及將根節點數值進行修改。

表示式可以解析成樹的結構,葉子節點放運算元,內部的節點則放相應的操作符。

將全括號表示式轉換成相應的樹結構:

1、碰到**(** 則新增左子節點,當前節點下降到該子節點;

2、碰到+ - * /等操作符,則當前節點設定為操作符,新建右子節點,並下降到該右子節點;

3、碰到的是運算元,則當前節點設定為運算元,再上公升到父節點;

4、碰到則上公升到父節點;

def

buildparsetree

(fpexp)

: fplist = fpexp.split(

) pstack = stack(

) etree =binarytree('')

pstack.push(etree)

currenttree=etree

for i in fplist:

if i==

'(':

currenttree.insertleft('')

pstack.push(currenttree)

currenttree=currenttree.getleft(

)elif i notin[

'+',

'-',

'*',

'/',

')']

currenttree.setrootobj(

int(i)

) parent=pstack.pop(

) currenttree=parent

elif i in

['+'

,'-'

,'*'

,'/']:

currenttree.setrootobj(i)

currenttree.insertright('')

pstack.push(currenttree)

currenttree=currenttree.getright(

)elif i ==

')':

currenttree=pstack.pop(

)else

:raise valueerror

return etree

對乙個資料機構中的所有資料進行訪問,叫做遍歷。線性結構中的訪問太簡單了,而對於樹,圖等資料結構則較為複雜,所以值得研究。

就二叉樹來說,分為前序遍歷,中序遍歷和後序遍歷。使用遞迴思想,完成遍歷非常的簡潔明瞭。

def

preoder

(tree)

:if tree:

print

(tree.getrootobj)

preoder(tree.getleft())

preoder(tree.getright())

defpostorder

(tree)

:if tree:

postorder(tree.getleft)

postorder(tree.getright)

print

(tree.getrootobj)

definorder

(tree)

:if tree:

inorder(tree.getleft)

print

(tree.getrootobj)

inorder(tree.getright)

樹的子結構 python

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 遞迴遍歷a樹,若遇到a樹的節點和b樹根節點相同,則開始判斷是否為子樹。class solution def hassubtree self,proot1,proot2 result false if not pr...

Python 資料結構與演算法 tree(樹)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!我們可將該樹表示為乙個二維列表 lists of lists t a,b c d e f 在某些情況下,由於我們可能事先知道其內部節點 internal node 所能擁有的最大子節點數,例如,二叉樹,各節點最多只能擁有兩個子節點,所以可以選擇其他...

Python 資料結構與演算法 tree(樹)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!我們可將該樹表示為乙個二維列表 lists of lists t a,b c d e f 在某些情況下,由於我們可能事先知道其內部節點 internal node 所能擁有的最大子節點數,例如,二叉樹,各節點最多只能擁有兩個子節點,所以可以選擇其他...