這一節比較重要,講述樹這種資料結構以及一些常用的知識和應用。樹這種結構,比 線性結構要複雜和靈活一點,所以可以實現更多的邏輯難題,相比於圖的話用的又更多一點,所以需要多多練習。
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 所能擁有的最大子節點數,例如,二叉樹,各節點最多只能擁有兩個子節點,所以可以選擇其他...