版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录
第7章树和二叉树.............................................................2
哈夫曼编码..............................................................2
7.8实例.....................................................................4
7.8.1打印二叉树的深度..................................................4
7.8.2打印二叉树的左右视图..............................................6
7.8.3二叉树左右交换....................................................9
第7章树和二叉树
哈夫曼编码
#树节点类构建
classTreeNode(object):
def—init_(self,data):
self.val=datafO]#节点的值
self.priority=data[l]#节点的优先度
self.leftChild=None#节点广结点
self.rightChild=None#节点的右子结点
self.code="n,#节点值的编码
#创建树节点队列函数
defcreatnodeQ(codes):
q=口
forcodeincodes:
q.append(TreeNode(code))
returnq
#为队列添加节点元素,并保证优先度从大到小排列
defaddQ(queue,nodeNew):
iflen(queue)==0:
returnfnodeNew]
foriinrange(len(queue)):
ifqueue[il.priority>=nodeNew.priority:
returnqueuel:ij+[nodeNewJ+queue[i:J
returnqueue+fnodeNew]
#节点队列类定义
classnodeQeuen(object):
def_init_(self,code):
self.que=creatnodeQ(code)
self.size=len(self.que)
defaddNode(self,node):#添加节点困数
self.que=addQ(self.que,node)
self.size+=1
defpopNode(self):#弹11i节点函数
self.size-=1
returnself.que.pop(O)
#各个字符在字符串中出现的次数,即计算优先度
deffreChar(string):
d={}
#定义一个字典,遍历文本中的每一个字母,若字母不在字典里说明是第一次出现,则定义该字
母为键,另键值为1,若在字典里有,则只需将相应的键值加一。遍历后就得到了每个字母出现的
次数。
forcinstring:
ifnotcind:
d[c]=1
else:
d[c]+=1
returnsorted(d.items(),key=lambdax:x[l])
#创建哈夫曼树
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)
【程序运行结果】
{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)
【程序运行结果】
max_deep:3
7.8.2打印二叉树的左右视图
【例7-1】给定一棵二叉树,要求输出左右视图,如图7.25所示。
3
/\
920
/\
157
图7.25二叉树
程序运行结果为:左视图:[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)
#找到距离根节点指定距离的所有节点
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("节点层次输出: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))
【程序运行结果】
节点层次输出:[[3],[9,20],[15,7]]
左视图:[3,9,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年环保产品购销合同标准文本一
- 2024-2030年中国奶茶粉行业市场销售渠道及未来趋势发展分析报告
- 2024-2030年中国大数据金融行业发展创新模式及投资规划分析报告
- 2024-2030年中国垃圾转运车行业竞争格局展望及投资策略分析报告
- 2024-2030年中国印刷机械制造行业产销需求及投资策略分析报告
- 2024年版给排水系统安装作业劳务合作合同版B版
- 2024年智能穿戴设备设计优化与功能升级合同3篇
- 2024年物资购销合同范例
- 眉山药科职业学院《首饰材料与首饰设计实践》2023-2024学年第一学期期末试卷
- 2024劳动资源开发合同3篇
- 2025届湖北十一校联考高三语文考场高分作文:平替到底好不好
- 《西方经济学(本)》形考任务(1-6)试题答案解析
- 人教版八年级语文上册《人民英雄永垂不朽》教学课件
- 机电一体化项目职业技能大赛试题(SX-815Q)
- 《消防应急疏散培训》课件
- 8.3数学建模活动的主要过程课件-高一上学期数学北师大版(2019)必修第一册
- 护理学专业大学生职业规划书
- 2025年春九年级语文下册 第三单元综合测试卷(人教陕西版)
- 北师大版五年级上册数学期末测试卷及答案共5套
- EXCEL培训课件分享第二阶段培训
- 体育赛事管理系统整体解决方案
评论
0/150
提交评论