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微信公众号之关注公众号自动回复
Oct 25 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
Python 中Django安装和使用教程详解
Jul 03 Python
Python实现12306火车票抢票系统
Jul 04 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
如何理解python对象
Jun 21 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
python 基于wx实现音乐播放
Nov 24 Python
基于Django快速集成Echarts代码示例
Dec 01 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
jquery提交form表单简单示例分享
2014/03/03 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
原生JS实现天气预报
2020/06/16 Javascript
js实现碰撞检测
2021/01/29 Javascript
Python实现115网盘自动下载的方法
2014/09/30 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
Django之form组件自动校验数据实现
2020/01/14 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
心得体会开头
2014/01/01 职场文书
任命书格式
2014/06/05 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
甜品店创业计划书
2014/09/21 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android