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实现截屏的函数
Jul 25 Python
Python selenium 三种等待方式解读
Sep 15 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
python列表list保留顺序去重的实例
Dec 14 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
python 多线程串行和并行的实例
Feb 22 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
Python适配器模式代码实现解析
Aug 02 Python
python函数声明和调用定义及原理详解
Dec 02 Python
用python开发一款操作MySQL的小工具
May 12 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
PHP 危险函数解释 分析
2009/04/22 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php多重接口的实现方法
2015/06/20 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
Python使用gRPC传输协议教程
2018/10/16 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
银行职员自我鉴定
2014/04/20 职场文书
供货协议书
2014/04/22 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
普通党员整改措施
2014/10/24 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python