![數(shù)據(jù)結(jié)構(gòu)與算法(Python版) 源代碼 (周元哲 版)第7章 樹和二叉樹_第1頁](http://file4.renrendoc.com/view14/M02/1F/3E/wKhkGWZ_XgCAS8vlAAB5PrSNym8190.jpg)
![數(shù)據(jù)結(jié)構(gòu)與算法(Python版) 源代碼 (周元哲 版)第7章 樹和二叉樹_第2頁](http://file4.renrendoc.com/view14/M02/1F/3E/wKhkGWZ_XgCAS8vlAAB5PrSNym81902.jpg)
![數(shù)據(jù)結(jié)構(gòu)與算法(Python版) 源代碼 (周元哲 版)第7章 樹和二叉樹_第3頁](http://file4.renrendoc.com/view14/M02/1F/3E/wKhkGWZ_XgCAS8vlAAB5PrSNym81903.jpg)
![數(shù)據(jù)結(jié)構(gòu)與算法(Python版) 源代碼 (周元哲 版)第7章 樹和二叉樹_第4頁](http://file4.renrendoc.com/view14/M02/1F/3E/wKhkGWZ_XgCAS8vlAAB5PrSNym81904.jpg)
![數(shù)據(jù)結(jié)構(gòu)與算法(Python版) 源代碼 (周元哲 版)第7章 樹和二叉樹_第5頁](http://file4.renrendoc.com/view14/M02/1F/3E/wKhkGWZ_XgCAS8vlAAB5PrSNym81905.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
目錄
第7章樹和二叉樹.............................................................2
哈夫曼編碼..............................................................2
7.8實例.....................................................................4
7.8.1打印二叉樹的深度..................................................4
7.8.2打印二叉樹的左右視圖..............................................6
7.8.3二叉樹左右交換....................................................9
第7章樹和二叉樹
哈夫曼編碼
#樹節(jié)點類構(gòu)建
classTreeNode(object):
def—init_(self,data):
self.val=datafO]#節(jié)點的值
self.priority=data[l]#節(jié)點的優(yōu)先度
self.leftChild=None#節(jié)點廣結(jié)點
self.rightChild=None#節(jié)點的右子結(jié)點
self.code="n,#節(jié)點值的編碼
#創(chuàng)建樹節(jié)點隊列函數(shù)
defcreatnodeQ(codes):
q=口
forcodeincodes:
q.append(TreeNode(code))
returnq
#為隊列添加節(jié)點元素,并保證優(yōu)先度從大到小排列
defaddQ(queue,nodeNew):
iflen(queue)==0:
returnfnodeNew]
foriinrange(len(queue)):
ifqueue[il.priority>=nodeNew.priority:
returnqueuel:ij+[nodeNewJ+queue[i:J
returnqueue+fnodeNew]
#節(jié)點隊列類定義
classnodeQeuen(object):
def_init_(self,code):
self.que=creatnodeQ(code)
self.size=len(self.que)
defaddNode(self,node):#添加節(jié)點困數(shù)
self.que=addQ(self.que,node)
self.size+=1
defpopNode(self):#彈11i節(jié)點函數(shù)
self.size-=1
returnself.que.pop(O)
#各個字符在字符串中出現(xiàn)的次數(shù),即計算優(yōu)先度
deffreChar(string):
d={}
#定義一個字典,遍歷文本中的每一個字母,若字母不在字典里說明是第一次出現(xiàn),則定義該字
母為鍵,另鍵值為1,若在字典里有,則只需將相應的鍵值加一。遍歷后就得到了每個字母出現(xiàn)的
次數(shù)。
forcinstring:
ifnotcind:
d[c]=1
else:
d[c]+=1
returnsorted(d.items(),key=lambdax:x[l])
#創(chuàng)建哈夫曼樹
defcreatHuffmanTree(nodeQ):
whilenodeQ.size!=1:
nodel=nodeQ.popNode()
node2=nodeQ.popNode()
r=TreeNode([None,nodel.priority+node2.priority])
r.leftChild=nodel
r.rightChild=node2
nodeQ.addNode(r)
returnnodeQ.popNode()
codeDicl={}#用于編碼
codeDic2={}#用于解碼
#由哈夫曼樹得到哈夫曼編碼表
defHuffmanCodeDic(head,x):
globalcodeDic,codeList
ifhead:
HuffmanCodeDic(head.leftChild,x+'O')
#二叉樹的中序遍歷,每遞歸到深一層的時候,就隹后面多加?個O(左子樹)或T(右子樹)。
head.code+=x
ifhead.val:
codeDic2[head.code]=head.val
codeDic1[head,val]=head.code
HuffmanCodeDic(head.rightChild,x+T)
#字符串編碼
defTransEncode(string):
globalcodeDic1
transcode=
forcinstring:
transcode+=codeDicl[c]
returntranscode
#字符串解碼
defTransDecode(StringCode):
globalcodeDic2
code”
ans=
forchinStringCode:
code+=ch
ifcodeincodeDic2:
ans+=codeDic2[code]
code”
returnans
#舉例
string="AAGGDCCCDDDGFBBBFFGGDDDDGGGEFFDDCCCCDDFGAAA”
t=nodeQeuen(freChar(string))
tree=creatHuffmanTree(t)
HuffmanCodeDic(tree,0)
print(codeDic1,codeDic2)
a=TransEncode(string)
print(a)
aa=TransDecode(a)
print(aa)
print(string==aa)
【程序運行結(jié)果】
{E:woo','B*:wor,*A':'oor,G:‘or,D':'io;F:C:{'oooo':'E,wor:B,
wr:'A'jor:G,"o’:‘D',」io‘:F/iir:rc)
0010010101101111111111010100111000010001000111011001011010101001010100001101
1010101nil1111111101011001001001001
AAGGDCCCDDDGFBBBFFGGDDDDGGGEFFDDCCCCDDFGAAA
True
7.8實例
7.8.1打印二叉樹的深度
【例7-1】給定一棵二叉樹,要求樹的深度。如圖7.24所示。
圖7.24二叉樹
【程序運行代碼】
classNode():
def—init_(self,value,lchild=None,rchild=None,):
self.value=value
self.lchild=lchild
self.rchild=rchild
def_repr_(self):
returnstr(self.value)
classTree():
def_init_(self,root=None):
self.root=root
self.node_list=[]
defadd_node(self,node):
self.node_list.append(node)
temp」ist=1]
temp_list.append(self.root)
ifself.root==None:
self.root=node
else:
whiletempjist:
cur_node=temp_list.pop(0)
ifnotcur_node.lchild:
cur_node.lchild=node
return
elifnotcur_node.rchild:
cur_node.rchild=node
return
else:
temp_list.append(cur_node.lchild)
temp_list.append(cur_node,rchild)
#二叉樹的最大深度
deffind_max_deep(self,root):
if(notroot.lchild)and(notroot.rchild):
return1
ifroot.lchild:
lenghtl=self.find_max_deep(root.lchild)
else:
lenghtl=0
ifroot.rchild:
lenght2=self.find_max_deep(root.rchild)
else:
lenght2=0
return1+max(lenght1,lenght2)
if_name_=='_main_
tree=Tree()
nodel=Node(l)
node2=Node(2)
node3=Node(3)
node4=Node(4)
node5=Node(5)
tree.add_node(node1)
tree.add_node(node2)
tree.add_node(node3)
tree.add_node(node4)
tree.add_node(node5)
max_deep=tree.find_max_deep(tree.root)
print('max_deep:',max_deep)
【程序運行結(jié)果】
max_deep:3
7.8.2打印二叉樹的左右視圖
【例7-1】給定一棵二叉樹,要求輸出左右視圖,如圖7.25所示。
3
/\
920
/\
157
圖7.25二叉樹
程序運行結(jié)果為:左視圖:[3,9,15]左視圖:[3,20,7]
【程序運行代碼】
classNode():
def_ink_(self,value,lchild=None,rchild=None,):
self.value=value
self.lchild=lchild
self.rchild=rchild
def_repr_(self):
returnstr(self.value)
classTree():
def_init_(self,root=None):
self.root=root
self.node_list=[]
defadd_node(seif,node):
self.node_list.append(node)
temp」ist=[]
temp_list.append(self.root)
ifself.root==None:
self.root=node
else:
whiletemp_list:
cur_node=temp_list.pop(0)
ifnotcur_node.lchild:
cur_node.lchild=node
return
elifnotcur_node.rchild:
cur_node.rchild=node
return
else:
temp_list.append(cur_node.lchild)
temp_list.append(cur_node.rchild)
#找到距離根節(jié)點指定距離的所有節(jié)點
deffind_target_length(self,root,n,target_list=[]):
ifn==0:
target_list.append(root)
#print(self.target_list)
#returntarget_list
ifroot.lchild:
self.find_target_length(root.lchild,n-l,target_list)
ifroot.rchild:
self.find_target_length(root.rchild,n-l,target_list)
returntarget」ist
#二叉樹的最大深度
deffind_max_deep(self,root):
if(notroot.lchild)and(notroot.rchild):
return1
ifroot.lchild:
lenghtl=self.find_max_deep(root.lchild)
else:
lenghtl=O
ifroot.rchild:
lenght2=self.find_max_deep(root.rchild)
else:
lenght2=0
return1+max(lenght1,lenght2)
#二叉樹的左視圖
deffind_view(self,root):
deep」ist=[]
out_put_list=[]
max_deep=self.find_max_deep(root)
cur_deep=0
whilecur_deep<max_deep:
cur_deep_list=self.find_target_length(root,cur_deep)
#print(cur_deep_list)
deep_list.append(cur_deep_list.copy())
cur_deep_list.clear()
cur_deep+=l
print("節(jié)點層次輸出:n,deep_Hst)
foritemindeep_list:
#求左視圖
out_put_list.append(item[OJ)
#求右視圖
#out_put_list.append(item[-1])
returnout_put」ist
if—name—=='—main—
tree=Tree()
nodel=Node(3)
node2=Node(9)
node3=Node(20)
node4=Node(15)
node5=Node(7)
tree.add_node(nodeI)
tree.add_node(node2)
tree.add_node(node3)
tree.add_node(node4)
tree.add_node(node5)
print("左視圖:u,tree.find_view(tree.root))
【程序運行結(jié)果】
節(jié)點層次輸出:[[3],[9,20],[15,7]]
左視圖:[3,9,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史九年級下冊:第11課 《蘇聯(lián)的社會主義建設》 聽課評課記錄
- 《溝通中外文明的“絲綢之路”》名師聽課評課記錄(新部編人教版七年級上冊歷史)
- 生物醫(yī)藥產(chǎn)業(yè)園監(jiān)理合同(2篇)
- 電力價格調(diào)整合同(2篇)
- 五年級上冊數(shù)學聽評課記錄《7.1 誰先走》(3)-北師大版
- 部編人教版歷史九年級上冊第15課《探尋新航路》聽課評課記錄
- 湘教版數(shù)學八年級上冊《小結(jié)練習》聽評課記錄5
- 人教版數(shù)學七年級上冊3.2《解一元一次方程(一)-合并同類項與移項》聽評課記錄1
- 五年級上冊數(shù)學聽評課記錄-總復習2-北師大版
- 新版湘教版秋八年級數(shù)學上冊第二章三角形課題三角形的內(nèi)角和定理聽評課記錄
- 必修3《政治與法治》 選擇題專練50題 含解析-備戰(zhàn)2025年高考政治考試易錯題(新高考專用)
- 二零二五版電商企業(yè)兼職財務顧問雇用協(xié)議3篇
- 課題申報參考:流視角下社區(qū)生活圈的適老化評價與空間優(yōu)化研究-以沈陽市為例
- 《openEuler操作系統(tǒng)》考試復習題庫(含答案)
- 2024-2025學年人教版生物八年級上冊期末綜合測試卷
- 創(chuàng)傷急救-止血、包扎課件
- 大數(shù)據(jù)背景下網(wǎng)絡輿情成因及治理
- 道教系統(tǒng)諸神仙位寶誥全譜
- 中國經(jīng)濟轉(zhuǎn)型導論-政府與市場的關系課件
- 新視野大學英語讀寫教程 第三版 Book 2 unit 8 教案 講稿
- 村務公開表格
評論
0/150
提交評論