一基礎(chǔ)學(xué)習(xí)
1.pylab 模塊是一款由python提供的可以繪制二維,三維數(shù)據(jù)的工具模塊泡躯,其中包括了繪圖軟件包 matplotlib,其可以生成matab繪圖庫的圖像。?
安裝pylab模塊:pylab是matplotlib中的一個(gè)模塊 所以我們直接安裝matplotlib庫。
pip install matplotlib
例子:y = 2x
import pylab
my_list=[ ]
for counter in range(10):
? ? my_list.append(counter*2)
print my_list
print len(my_list)
#now plot the list
pylab.plot(my_list)
pylab.show()
2.數(shù)據(jù)結(jié)構(gòu)-樹
樹是一種非線性的數(shù)據(jù)結(jié)構(gòu)精续,是由n(n >=0)個(gè)結(jié)點(diǎn)組成的有限集合。
如果n==0粹懒,樹為空樹重付。
如果n>0,
樹有一個(gè)特定的結(jié)點(diǎn)凫乖,根結(jié)點(diǎn)
根結(jié)點(diǎn)只有直接后繼确垫,沒有直接前驅(qū)。
除根結(jié)點(diǎn)以外的其他結(jié)點(diǎn)劃分為m(m>=0)個(gè)互不相交的有限集合帽芽,T0删掀,T1,T2导街,...披泪,Tm-1,每個(gè)結(jié)合是一棵樹搬瑰,稱為根結(jié)點(diǎn)的子樹款票。
數(shù)據(jù)結(jié)構(gòu)中有很多樹的結(jié)構(gòu),其中包括二叉樹泽论、二叉搜索樹艾少、2-3樹、紅黑樹等等翼悴。
樹的度/樹的前驅(qū)后繼/樹的層次/樹的有序性/森林等概念參考博文學(xué)習(xí):http://blog.51cto.com/9291927/2068745
3.樹的遍歷
不要帶著二叉樹的遍歷來限制了對樹的遍歷的理解缚够。?
樹的遍歷的定義:以某種方式訪問樹中的每一個(gè)結(jié)點(diǎn),且僅訪問一次鹦赎。?
樹的遍歷主要有先根遍歷和后根遍歷谍椅。
先根遍歷:若樹非空,則先訪問根結(jié)點(diǎn)古话,再按照從左到右的順序遍歷根結(jié)點(diǎn)的每一棵子樹毯辅。這個(gè)訪問順序與這棵樹對應(yīng)的二叉樹的先序遍歷順序相同。
后根遍歷:若樹非空煞额,則按照從左到右的順序遍歷根結(jié)點(diǎn)的每一棵子樹思恐,之后再訪問根結(jié)點(diǎn)。其訪問順序與這棵樹對應(yīng)的二叉樹的中序遍歷順序相同膊毁。
森林的遍歷:需要注意的是胀莹,只有二叉樹森林才有中序遍歷與完整二叉樹中序遍歷對應(yīng)?
先序遍歷森林。
博文學(xué)習(xí):樹的常見算法&圖的DFS和BFS(https://www.cnblogs.com/LUO77/p/5839273.html)
二練習(xí)錯(cuò)題
1.證明算法的正確性
要做下面的事情:
● 合法輸入數(shù)據(jù)的說明
● 輸入和期望輸出之間的關(guān)系
算法的正確性:整體正確和部分正確
證明正確性的時(shí)候我們一般分兩個(gè)階段:
● 一用不變式來證明算法的部分正確性婚温。不變式指的是依附于算法中的一條特定的語句描焰,該語句對計(jì)算的結(jié)果狀態(tài)進(jìn)行判斷。
● 二用收斂性來嚴(yán)整算法的整體正確性。收斂性是證明算法在特定的合法輸入數(shù)據(jù)的情況下荆秦,會正常結(jié)束的一種方法篱竭。
2.樹的練習(xí)
def set_children(self, mother, list_of_children):
? ? ? ? # convert name to Member node (should check for validity)
? ? ? ? mom_node = self.names_to_nodes[mother]?
? ? ? ? # add each child
? ? ? ? for c in list_of_children:? ? ? ? ?
? ? ? ? ? ? # create Member node for a child?
? ? ? ? ? ? c_member = Member(c)? ? ? ? ? ? ?
? ? ? ? ? ? # remember its name to node mapping
? ? ? ? ? ? self.names_to_nodes[c] = c_member? ?
? ? ? ? ? ? # set child's parent
? ? ? ? ? ? c_member.add_parent(mom_node)? ? ? ?
? ? ? ? ? ? # set the parent's child
? ? ? ? ? ? mom_node.add_child(c_member)? ? ? ?
? ? def is_parent(self, mother, kid):
? ? ? ? mom_node = self.names_to_nodes[mother]
? ? ? ? child_node = self.names_to_nodes[kid]
? ? ? ? return child_node.is_parent(mom_node)?
? ? def is_child(self, kid, mother):
? ? ? ? mom_node = self.names_to_nodes[mother]?
? ? ? ? child_node = self.names_to_nodes[kid]
? ? ? ? return mom_node.is_child(child_node)
3.PROBLEM 7
#7-1
definsert(atMe, newFrob):
? ??if newFrob.name == atMe.name:?
?????????newFrob.after = atMe.after?
?????????atMe.after = newFrob?
?????????newFrob.before = atMe
????????if newFrob.after:
?????????????newFrob.after.before = newFrob
? ??elif newFrob.name < atMe.name:
????????if not atMe.before:
????????????atMe.before = newFrob?
? ? ? ? ? ? newFrob.after = atMe
? ??????elif atMe.before and atMe.before == newFrob.before:?
? ? ? ? ? ? newFrob.after = atMe?
? ? ? ? ? ? atMe.before = newFrob?
? ? ? ? ? ? newFrob.before.after = newFrob
????????else:
? ??????????newFrob.after = atMe
? ? ? ? ? ? insert(atMe.before, newFrob)
? ??else:
????????if atMe.after and atMe.after == newFrob.after:?
?????????????newFrob.before = atMe?
?????????????atMe.after = newFrob?
?????????????newFrob.after.before = newFrob
????????elif atMe.after ==None:?
?????????????atMe.after = newFrob?
?????????????newFrob.before = atMe
????????else:?
?????????????newFrob.before = atMe?
?????????????insert(atMe.after, newFrob)
#7-2
def findFront(start):
? ??if not start.getBefore():
????????return start
????else:
return findFront(start.getBefore())