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生成器的使用方法
Nov 21 Python
讲解Python中if语句的嵌套用法
May 14 Python
Python实现的单向循环链表功能示例
Nov 10 Python
python删除某个字符
Mar 19 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python 穷举指定长度的密码例子
Apr 02 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
PHP微商城开源代码实例
2019/03/27 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
常用的javascript function代码
2008/05/23 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python求出0~100以内的所有素数
2018/01/23 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
python——全排列数的生成方式
2020/02/26 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
Django实现简单的分页功能
2021/02/22 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
教师见习期自我鉴定
2014/04/28 职场文书
2014年终个人工作总结
2014/11/07 职场文书
项目安全员岗位职责
2015/02/15 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python