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命令行参数解析模块getopt使用实例
Apr 13 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
python找出完数的方法
Nov 12 Python
python组合无重复三位数的实例
Nov 13 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
基于python二叉树的构造和打印例子
Aug 09 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
详细介绍python类及类的用法
May 31 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
简单易用的计数器(数据库)
2006/10/09 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python中argparse模块用法实例详解
2015/06/03 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
浅析python的优势和不足之处
2018/11/20 Python
python样条插值的实现代码
2018/12/17 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
python实现定时发送邮件
2020/12/23 Python
详解python的变量缓存机制
2021/01/24 Python
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
秘书行业自我鉴定范文
2013/12/30 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
自荐信的基本格式
2014/02/22 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
毕业晚会主持词
2014/03/24 职场文书
服装发布会策划方案
2014/05/22 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
2014年财政所工作总结
2014/11/22 职场文书