此文将讲述如何用python实战解决二叉树实验

前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法

点击我进入python速成笔记

先看一下最终效果图:

首先我们要定义二叉树结点的一个类,在python中定义二叉树结点代码如下:

  1. #二叉链表
  2. class BiTree:
  3. def __init__(self, elementType=None, lchild=None, rchild=None):
  4. self.elementType = elementType
  5. self.lchild = lchild
  6. self.rchild = rchild

其次初始化二叉树头结点的代码如下:

  1. #初始化二叉树新建头结点
  2. def initTree(s):
  3. temp=BiTree()
  4. ptree=BiTree("A",temp,temp)
  5. if s[2]==0:
  6. ptree.lchild=None
  7. if s[4]==0:
  8. ptree.rchild=None
  9. return ptree,temp

二叉树中经常需要访问子节点,那么子节点的代码:

  1. #寻找下一个结点
  2. def getNext(tree,temp):
  3. if(tree.lchild ==temp ):
  4. return tree
  5. if (tree.lchild!=None):
  6. if(getNext(tree.lchild,temp)!=None):
  7. return getNext(tree.lchild,temp)
  8. if (tree.rchild==temp):
  9. return tree
  10. if(tree.rchild !=None):
  11. if (getNext(tree.rchild,temp) != None):
  12. return getNext(tree.rchild,temp)
  13. return None

有了头结点也能找到子节点,那么绘图二叉树的代码如下:

绘图需要传入图形窗口对象,根节点,初始根节点x,y坐标以及深度1

  1. #画出二叉树图
  2. def drawroot(graph,root,x,y,deep):
  3. # 画椭圆
  4. oval = Oval(Point(x-20, y-20), Point(x+20, y+20))
  5. oval.setFill('blue') # 填充颜色
  6. oval.draw(graph)
  7. # 显示文字
  8. message = Text(Point(x, y), root.elementType)
  9. message.draw(graph)
  10. if(root.lchild!=None):
  11. # 画线
  12. line = Line(Point(x - 10, y + 10), Point(x - 30*deep, y + 60))
  13. line.draw(graph)
  14. drawroot(graph,root.lchild,x-30*deep,y+60,deep-1)
  15. if(root.rchild!=None):
  16. # 画线
  17. line = Line(Point(x+10, y + 10), Point(x + 30*deep, y + 60))
  18. line.draw(graph)
  19. drawroot(graph, root.rchild, x + 30*deep, y + 60,deep-1)

如何快速生成二叉树需要动用文件,根据文件链接子树代码:

读入根节点和一个临时结点,根节点名字和是否有左右子树开始链接

  1. #根据文件建立二叉链表
  2. def getTree(tree,temp,name,left,right):
  3. child=BiTree(name,temp,temp)
  4. if(not left):
  5. child.lchild=None
  6. if(not right):
  7. child.rchild=None
  8. if(tree.lchild==temp):
  9. tree.lchild=child
  10. elif(tree.rchild==temp):
  11. tree.rchild=child

具体完整读取代码完全链接子树代码如下:

  1. input = open('bt31.txt', 'r')
  2. s = []
  3. try:
  4. for line in input:
  5. s.append(line)
  6. finally:
  7. input.close()
  8. ptree, temp = initTree(s[0])
  9. for i in range(len(s)):
  10. if i != 0:
  11. getTree(getNext(ptree, temp), temp, s[i][0], eval(s[i][2]), eval(s[i][4]))

然后生成图形窗口绘制上面二叉树代码为:

  1. gragh = GraphWin('CSSA', 1200, 700)
  2. drawroot(gragh, ptree, 500, 20, 4)

效果如下:

以上便是二叉树生成的前提操作,后面代码即为数据结构实验五二叉树1-10题必做题源代码以及12,13,15选做题源码:

  1. #三种二叉遍历
  2. def DLR(tree):
  3. order=[]
  4. if(tree!=None):
  5. order.append(tree.elementType)
  6. if(tree.lchild!=None):
  7. order=order+DLR(tree.lchild)
  8. if(tree.rchild!=None):
  9. order=order+DLR(tree.rchild)
  10. return order
  11. def LDR(tree):
  12. order=[]
  13. if (tree != None):
  14. if (tree.lchild != None):
  15. order = order + LDR(tree.lchild)
  16. order.append(tree.elementType)
  17. if (tree.rchild != None):
  18. order = order + LDR(tree.rchild)
  19. return order
  20. def LRD(tree):
  21. order=[]
  22. if (tree != None):
  23. if (tree.lchild != None):
  24. order = order + LRD(tree.lchild)
  25. if (tree.rchild != None):
  26. order = order + LRD(tree.rchild)
  27. order.append(tree.elementType)
  28. return order
  29. #打印题目一信息
  30. def exp1(gragh,ptree):
  31. str=""
  32. str += "先序遍历:"
  33. for i in range(len(DLR(ptree))):
  34. str+=DLR(ptree)[i]
  35. str +="\n"
  36. str += "中序遍历:"
  37. for i in range(len(LDR(ptree))):
  38. str +=LDR(ptree)[i]
  39. str +="\n"
  40. str += "后序遍历:"
  41. for i in range(len(LRD(ptree))):
  42. str +=LRD(ptree)[i]
  43. str +="\n"
  44. message = Text(Point(200, 400), "1.打印出二叉树的三种遍历序\n"+str)
  45. message.draw(gragh)
  46. #遍历结点层次
  47. def DLRDeep(tree,deep):
  48. order=""
  49. if(tree!=None):
  50. order=order+tree.elementType+" "+repr(deep)+"\n"
  51. if(tree.lchild!=None):
  52. order=order+DLRDeep(tree.lchild,deep+1)
  53. if(tree.rchild!=None):
  54. order=order+DLRDeep(tree.rchild,deep+1)
  55. return order
  56. def exp2(gragh,ptree):
  57. str=DLRDeep(ptree,1)
  58. message = Text(Point(1000, 300), "2.输出各结点的层次\n"+str)
  59. message.draw(gragh)
  60. #查找树的高度
  61. def height(tree):
  62. h=0
  63. if(tree!=None):
  64. left=height(tree.lchild)
  65. right=height(tree.rchild)
  66. if(left>right):
  67. h=left+1
  68. else :
  69. h=right+1
  70. return h
  71. def exp3(gragh,ptree):
  72. str="3.该二叉树高度为"+repr(height(ptree))
  73. message = Text(Point(500, 350), str)
  74. message.draw(gragh)
  75. #查询结点数量
  76. def getnum(tree):
  77. num=0
  78. if(tree!=None):
  79. num=num+1
  80. num+=getnum(tree.lchild)
  81. num+=getnum(tree.rchild)
  82. return num
  83. def exp4(gragh,ptree):
  84. str="4.该二叉树结点数为"+repr(getnum(ptree))
  85. message = Text(Point(500, 400), str)
  86. message.draw(gragh)
  87. #查询叶子结点数量
  88. def getleaf(tree):
  89. num=0
  90. if(tree!=None):
  91. num+=getleaf(tree.lchild)
  92. num+=getleaf(tree.rchild)
  93. if(tree.lchild==None and tree.rchild==None):
  94. return 1
  95. return num
  96. def exp5(gragh,ptree):
  97. str="5.该二叉树叶子结点数为"+repr(getleaf(ptree))
  98. message = Text(Point(500, 450), str)
  99. message.draw(gragh)
  100. #查询两个度的结点数量
  101. def getTwo(tree):
  102. num=0
  103. if(tree!=None):
  104. num+=getTwo(tree.lchild)
  105. num+=getTwo(tree.rchild)
  106. if(tree.lchild!=None and tree.rchild!=None):
  107. num+=1
  108. return num
  109. def exp6(gragh,ptree):
  110. str="6.该二叉树有两个度的结点有:"+repr(getTwo(ptree))
  111. message = Text(Point(500, 500), str)
  112. message.draw(gragh)
  113. #查询父亲结点,兄弟结点,子节点
  114. def findFather(tree,name):
  115. if(tree!=None):
  116. if(tree.lchild!=None and tree.lchild.elementType==name):
  117. return tree
  118. if(tree.rchild!=None and tree.rchild.elementType==name):
  119. return tree
  120. if findFather(tree.rchild,name)!=None:
  121. return findFather(tree.rchild,name)
  122. if findFather(tree.lchild,name)!=None:
  123. return findFather(tree.lchild,name)
  124. return None
  125. def info(tree,name):
  126. father=findFather(tree,name)
  127. if(father.lchild!=None and father.lchild.elementType==name):
  128. brother=father.rchild
  129. son1=father.lchild.lchild
  130. son2=father.lchild.rchild
  131. else :
  132. brother=father.lchild
  133. son1=father.rchild.lchild
  134. son2=father.rchild.rchild
  135. return father,brother,son1,son2
  136. def exp7(gragh ,tree,name):
  137. str=""
  138. father,brother,son1,son2=info(tree,name)
  139. if(father==None):
  140. str+="8.父节点不存在"+"\n"
  141. else:
  142. str+="8.父节点为:"+repr(father.elementType)+"\n"
  143. if(brother==None):
  144. str+="兄弟结点不存在"+"\n"
  145. else:
  146. str+="兄弟结点为:"+repr(brother.elementType)+"\n"
  147. if(son1==None):
  148. str+="左子结点不存在"+"\n"
  149. else:
  150. str+="左子结点为:"+repr(son1.elementType)+"\n"
  151. if (son1 == None):
  152. str += "右子结点不存在"+"\n"
  153. else:
  154. str+="右子结点为:"+repr(son2.elementType)+"\n"
  155. message = Text(Point(400, 550), str)
  156. message.draw(gragh)
  157. #查询指定结点深度
  158. def getdeep(tree,name,deep): #EXP8
  159. if (tree != None):
  160. if (tree.elementType==name):
  161. return deep
  162. deepleft=getdeep(tree.lchild,name,deep+1)
  163. deepright=getdeep(tree.rchild,name,deep+1)
  164. if(deepleft!=0):
  165. return deepleft
  166. if(deepright!=0):
  167. return deepright
  168. return 0
  169. def exp8(gragh,tree,name):
  170. deep=getdeep(tree,name,1)
  171. if(deep==0):
  172. message = Text(Point(400, 500), "7.本结点不存在")
  173. message.draw(gragh)
  174. return 0
  175. else:
  176. message = Text(Point(400, 500), "7.本结点:"+repr(name)+"深度为"+repr(deep))
  177. message.draw(gragh)
  178. return 1
  179. #顺序存储变为二叉链表存储
  180. def seqToNode(s,tree,i):
  181. if(tree!=None):
  182. if(i*2>len(s)):
  183. tree.lchild=None
  184. elif (s[i*2]==None) :
  185. tree.lchild=None
  186. else:
  187. temp = BiTree(s[i*2])
  188. tree.lchild=temp
  189. if(i*2+1>len(s)):
  190. tree.rchild=None
  191. elif (s[i*2+1]==None):
  192. tree.rchild=None
  193. else:
  194. temp = BiTree(s[i*2 + 1])
  195. tree.rchild=temp
  196. seqToNode(s,tree.lchild,i*2)
  197. seqToNode(s,tree.rchild,i*2+1)
  198. #交换左右二叉树
  199. def change(tree):# EXP10
  200. if(tree!=None):
  201. temp=tree.lchild
  202. tree.lchild=tree.rchild
  203. tree.rchild=temp
  204. if(tree.lchild!=None):
  205. change(tree.lchild)
  206. if(tree.rchild!=None):
  207. change(tree.rchild)
  208. #找所有结点的路径
  209. def road(s,tree,all):
  210. if(tree.rchild==None and tree.lchild==None):
  211. all.append(repr(tree.elementType))
  212. all.append("到根节点的路径为"+reverse1(s)+"A"+"\n")
  213. if(tree.lchild!=None):
  214. road(s+tree.lchild.elementType,tree.lchild,all)
  215. if(tree.rchild!=None):
  216. road(s+(tree.rchild.elementType),tree.rchild,all)
  217. def exp12(all,gragh,ptree):
  218. str=""
  219. road(str, ptree, all)
  220. for i in range (len(all)):
  221. str+=all[i]
  222. message = Text(Point(150, 450), "12.从每个叶子结点到根结点的路径:\n"+str)
  223. message.draw(gragh)
  224. #按层次打印结点
  225. def exp13(gragh,tree):
  226. que=Queue()
  227. que.enqueue(tree)
  228. str="13.结点按层次打印结果为\n"
  229. while(not que.isEmpty()):
  230. if(que.getTop().lchild!=None):
  231. que.enqueue(que.getTop().lchild)
  232. if(que.getTop().rchild!=None):
  233. que.enqueue(que.getTop().rchild)
  234. str+=repr(que.getTop().elementType)
  235. que.outqueue()
  236. message = Text(Point(600, 400), str)
  237. message.draw(gragh)
  238. #查找最长路径
  239. def maxpath(temp,tree,path,deep):
  240. if (tree.rchild == None and tree.lchild == None):
  241. return temp,deep
  242. deep1,deep2=0,0
  243. if (tree.lchild != None):
  244. path1,deep1=maxpath(temp + tree.lchild.elementType, tree.lchild, path,deep+1)
  245. if (tree.rchild != None):
  246. path2,deep2=maxpath(temp + (tree.rchild.elementType), tree.rchild, path,deep+1)
  247. if(deep1>deep2):
  248. return path1,deep1
  249. else :
  250. return path2,deep2
  251. def exp15(gragh,tree):
  252. temp=""
  253. path=""
  254. path,deep=maxpath(temp,tree,path,1)
  255. message = Text(Point(600, 500), "15.该二叉树最长路径为:\nA"+path+"\n长度为"+repr(deep))
  256. message.draw(gragh)

值得注意的是13题需要用到队列,需要提前写好队列的代码如下:

  1. class Queue:
  2. """模拟队列"""
  3. def __init__(self):
  4. self.items = []
  5. def isEmpty(self):
  6. return self.items == []
  7. def enqueue(self, item):
  8. self.items.insert(0, item)
  9. def outqueue(self):
  10. return self.items.pop()
  11. def size(self):
  12. return len(self.items)
  13. def getTop(self):
  14. return self.items[self.size()-1]

上述便是代码的全部代码,效果如下

python实战--数据结构二叉树的更多相关文章

  1. python 与数据结构

    在上面的文章中,我写了python中的一些特性,主要是简单为主,主要是因为一些其他复杂的东西可以通过简单的知识演变而来,比如装饰器还可以带参数,可以使用装饰类,在类中不同的方法中调用,不想写的太复杂, ...

  2. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  3. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  4. 用Python实现数据结构之优先级队列

    优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这 ...

  5. zeromq 学习和python实战

    参考文档: 官网 http://zeromq.org/ http://www.cnblogs.com/rainbowzc/p/3357594.html   原理解读 zeromq只是一层针对socke ...

  6. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  7. Python实战:Python爬虫学习教程,获取电影排行榜

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  8. Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET

    Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET Python -- 堆数据结构 heapq 分类: Python 2012-09 ...

  9. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

随机推荐

  1. python + selenium 自动化测试框架

    分享一个网站自动化测试框架 结构如下: test_project|--logs|---pages |---register_page.py|      |---base_page.py|---test ...

  2. SpringMVC 异常的处理

    Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver: (2)实现Spring的异常处理接口Hand ...

  3. web 开发中的路由是什么意思

    路由: 就是一个路径的解析,根据客户端提交的路径,将请求解析到相应的控制器上 从 URL 找到处理这个 URL 的类和函数

  4. Linux crontab定时器设置(定期执行java程序)(转)

    Crontab 语法 Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码. *    *  *  *   *  command to be execut ...

  5. HDU 1892 See you~(二维树状数组)

    See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...

  6. 流式计算storm,spark文章

    使用Storm实现实时大数据分析!http://www.csdn.net/article/2012-12-24/2813117-storm-realtime-big-data-analysis     ...

  7. JavaNIO非阻塞模式

    package com.java.NIO; import java.io.IOException; import java.net.InetSocketAddress; import java.nio ...

  8. AngularJS学习篇(十四)

    AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...

  9. cross-document message 跨文档通信 HTML5

    跨域通信HTML5提供了XDM(cross-document message)安全简单接口:   核心是 postMessage()方法,用来向另一个地址传送信息: var iframeWindow ...

  10. phpmailer 发送邮件(一)

    phpmailer下载地址: PHPMailer : https://github.com/PHPMailer/PHPMailer 一.基本要求 Web访问正常(apache可以正常访问) php 设 ...