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 相关文章推荐
用smtplib和email封装python发送邮件模块类分享
Feb 17 Python
Python三元运算实现方法
Jan 12 Python
简单谈谈python基本数据类型
Sep 26 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
Python基础之文件读取的讲解
Feb 16 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
python设置环境变量的作用和实例
Jul 09 Python
python requests.get带header
May 05 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
pytorch 实现在测试的时候启用dropout
May 27 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
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
js实现密码强度检验
2017/01/15 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
Django实现学生管理系统
2019/02/26 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
Python matplotlib实时画图案例
2020/04/23 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Python如何重新加载模块
2020/07/29 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
为什么要使用servlet
2016/01/17 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
租房协议书范文
2014/08/20 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
小学中队活动总结
2015/05/11 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers