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单线程实现多个定时器示例
Mar 30 Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
Python标准库之sqlite3使用实例
Nov 25 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 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微框架Dispatch简介
2014/06/12 PHP
php使用PDO方法详解
2014/12/27 PHP
php实现插入排序
2015/03/29 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
document.compatMode介绍
2009/05/21 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python中类的初始化特殊方法
2017/12/01 Python
你真的了解Python的random模块吗?
2017/12/12 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
夜大毕业生自我评价分享
2013/11/10 职场文书
后勤主管工作职责
2013/12/07 职场文书
机关门卫岗位职责
2013/12/30 职场文书
《识字五》教学反思
2014/03/01 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
工作表现证明
2015/06/15 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android