Python二叉树定义与遍历方法实例分析


Posted in Python onMay 25, 2018

本文实例讲述了Python二叉树定义与遍历方法。分享给大家供大家参考,具体如下:

二叉树基本概述:

二叉树是有限个元素的几个,如果为空则为空二叉树,或者有一个结点称之为根节点,分列根节点两侧的为二叉树的左右子节点,二叉树有如下的性质:

1. 二叉树的每个结点不存在度大于2的结点
2. 二叉树的第i层至多有2^{i-1}个结点
3. 深度为k的二叉树至多有2^k - 1个结点
4. 二叉树中,度为0的结点数N0比度为2的结点数N2大1,即存在N2 + 1 = N0

Python代码:

#coding:utf-8
'BiTree'
class Node(object):
  'Node Defination'
  def __init__(self,item):
    self.item = item
    self.left = None
    self.right = None
class Tree(object):
  'Bitree Defination'
  def __init__(self):
    self.root = None
  def add(self,item):
    node = Node(item)
    if self.root is None:
      self.root = node
    else:
      q = [self.root]
      while True:
        pop_node = q.pop(0)
        if pop_node.left is None:
          pop_node.left = node
          return
        elif pop_node.right is None:
          pop_node.right = node
          return
        else:
          q.append(pop_node.left)
          q.append(pop_node.right)
  def traverse(self):#层次遍历
    if self.root is None:
      return None
    q = [self.root]
    res = [self.root.item]
    while q != []:
      pop_node = q.pop(0)
      if pop_node.left is not None:
        q.append(pop_node.left)
        res.append(pop_node.left.item)
      if pop_node.right is not None:
        q.append(pop_node.right)
        res.append(pop_node.right.item)
    return res
  def preorder(self,root): #先序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.preorder(root.left)
    right_item = self.preorder(root.right)
    return result + left_item + right_item
  def inorder(self,root): #中序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.inorder(root.left)
    right_item = self.inorder(root.right)
    return left_item + result + right_item
  def postorder(self,root): #后序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.postorder(root.left)
    right_item = self.postorder(root.right)
    return left_item + right_item + result
if __name__=='__main__':
  t = Tree()
  for i in range(10):
    t.add(i)
  print "层序遍历:",t.traverse()
  print "先序遍历:",t.preorder(t.root)
  print "中序遍历:",t.inorder(t.root)
  print "后序遍历:",t.postorder(t.root)

输出结果:

层序遍历: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
先序遍历: [0, 1, 3, 7, 8, 4, 9, 2, 5, 6]
中序遍历: [7, 3, 8, 1, 9, 4, 0, 5, 2, 6]
后序遍历: [7, 8, 3, 9, 4, 1, 5, 6, 2, 0]

这里对于

if __name__=='__main__':
“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

这里通过一个示例进行解释:

#test.py
def func():
 print "we are in %s"%__name__
if __name__ == '__main__':
 func()

输出结果:

we are in __main__

说明if语句中的内容被执行了,调用了 func()函数,现在在另一个模块中调用func函数

#testtest
from test import func
func()

输出结果:

we are in moudle

也就是说 if 条件中的内容没有执行。

总结:

如果直接执行某个*.py文件,该文件中 if __name__ == '__main__'是True,相当于调式本模块的代码;如果是从另一个模块(testtest.py)通过import导入该文件的时候,这时__name__就是这个模块的名字(test)而不是__main__,总之在调式代码的时候加上 if __name__ == '__main__'中加入调试代码,可以让步模块调用的时候不执行调式代码,如果想排查本模块代码的问题时,直接进行调试执行

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
python实现合并两个数组的方法
May 16 Python
python妹子图简单爬虫实例
Jul 07 Python
Python实现文件按照日期命名的方法
Jul 09 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
简单了解python反射机制的一些知识
Jul 13 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
如何提高python 中for循环的效率
Apr 15 Python
在python3.9下如何安装scrapy的方法
Feb 03 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 #Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 #Python
Python FTP两个文件夹间的同步实例代码
May 25 #Python
Python单元测试实例详解
May 25 #Python
python 请求服务器的实现代码(http请求和https请求)
May 25 #Python
django将图片上传数据库后在前端显式的方法
May 25 #Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 #Python
You might like
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
常用jQuery代码分享
2015/07/14 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
使用JavaScript破解web
2018/09/28 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python解惑之True和False详解
2017/04/24 Python
Python星号*与**用法分析
2018/02/02 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
详解django三种文件下载方式
2018/04/06 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
Python subprocess库的使用详解
2018/10/26 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
python中p-value的实现方式
2019/12/16 Python
python对XML文件的操作实现代码
2020/03/27 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
旅行社优秀创业计划书
2014/08/16 职场文书
2015年植树节活动总结
2015/02/06 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
JavaScript实现简单拖拽效果
2021/09/15 Javascript
SpringBoot集成Redis的思路详解
2021/10/16 Redis
Java中API的使用方法详情
2022/04/06 Java/Android