Python定义二叉树及4种遍历方法实例详解


Posted in Python onJuly 05, 2018

本文实例讲述了Python定义二叉树及4种遍历方法。分享给大家供大家参考,具体如下:

Python & BinaryTree

1. BinaryTree (二叉树)

二叉树是有限个元素的集合,该集合或者为空、或者有一个称为根节点(root)的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。

  • 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
  • 二叉树的第i层至多有2^{i-1}个结点
  • 深度为k的二叉树至多有2^k-1个结点;
  • 对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

2. 二叉树

Python定义二叉树及4种遍历方法实例详解

生成二叉树

# init a tree
def InitBinaryTree(dataSource, length):
  root = BTNode(dataSource[0])
  for x in xrange(1,length):
    node = BTNode(dataSource[x])
    InsertElementBinaryTree(root, node)
  return root
  print 'Done...'

前序遍历

# pre-order
def PreorderTraversalBinaryTree(root):
  if root:
    print '%d | ' % root.data,
    PreorderTraversalBinaryTree(root.leftChild)
    PreorderTraversalBinaryTree(root.rightChild)

中序遍历

# in-order
def InorderTraversalBinaryTree(root):
  if root:
    InorderTraversalBinaryTree(root.leftChild)
    print '%d | ' % root.data,
    InorderTraversalBinaryTree(root.rightChild)

后序遍历

# post-order
def PostorderTraversalBinaryTree(root):
  if root:
    PostorderTraversalBinaryTree(root.leftChild)
    PostorderTraversalBinaryTree(root.rightChild)
    print '%d | ' % root.data,

按层遍历

# layer-order
def TraversalByLayer(root, length):
  stack = []
  stack.append(root)
  for x in xrange(length):
    node = stack[x]
    print '%d | ' % node.data,
    if node.leftChild:
      stack.append(node.leftChild)
    if node.rightChild:
      stack.append(node.rightChild)

Result

Python定义二叉树及4种遍历方法实例详解

二叉树的思想重在“递归”, 并不是非要用递归处理,而是去理解二叉树递归的思想

完整代码段

# -*- coding:utf-8 -*-
#################
### implement Binary Tree using python
### Hongwing
### 2016-9-4
#################
import math
class BTNode(object):
  """docstring for BTNode"""
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild = None
# insert element
def InsertElementBinaryTree(root, node):
  if root:
    if node.data < root.data:
      if root.leftChild:
        InsertElementBinaryTree(root.leftChild, node)
      else:
        root.leftChild = node
    else:
      if root.rightChild:
        InsertElementBinaryTree(root.rightChild, node)
      else:
        root.rightChild = node
  else:
    return 0
# init a tree
def InitBinaryTree(dataSource, length):
  root = BTNode(dataSource[0])
  for x in xrange(1,length):
    node = BTNode(dataSource[x])
    InsertElementBinaryTree(root, node)
  return root
  print 'Done...'
# pre-order
def PreorderTraversalBinaryTree(root):
  if root:
    print '%d | ' % root.data,
    PreorderTraversalBinaryTree(root.leftChild)
    PreorderTraversalBinaryTree(root.rightChild)
# in-order
def InorderTraversalBinaryTree(root):
  if root:
    InorderTraversalBinaryTree(root.leftChild)
    print '%d | ' % root.data,
    InorderTraversalBinaryTree(root.rightChild)
# post-order
def PostorderTraversalBinaryTree(root):
  if root:
    PostorderTraversalBinaryTree(root.leftChild)
    PostorderTraversalBinaryTree(root.rightChild)
    print '%d | ' % root.data,
# layer-order
def TraversalByLayer(root, length):
  stack = []
  stack.append(root)
  for x in xrange(length):
    node = stack[x]
    print '%d | ' % node.data,
    if node.leftChild:
      stack.append(node.leftChild)
    if node.rightChild:
      stack.append(node.rightChild)
if __name__ == '__main__':
  dataSource = [3, 4, 2, 6, 7, 1, 8, 5]
  length = len(dataSource)
  BTree = InitBinaryTree(dataSource, length)
  print '****NLR:'
  PreorderTraversalBinaryTree(BTree)
  print '\n****LNR'
  InorderTraversalBinaryTree(BTree)
  print '\n****LRN'
  PostorderTraversalBinaryTree(BTree)
  print '\n****LayerTraversal'
  TraversalByLayer(BTree, length)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中字典和JSON互转操作实例
Jan 19 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
python游戏地图最短路径求解
Jan 16 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
基于Python实现扑克牌面试题
Dec 11 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
django教程如何自学
Jul 31 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
python自动化测试通过日志3分钟定位bug
Nov 20 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 #Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 #Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 #Python
解决Python pandas df 写入excel 出现的问题
Jul 04 #Python
python处理数据,存进hive表的方法
Jul 04 #Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 #Python
使用pandas read_table读取csv文件的方法
Jul 04 #Python
You might like
PHP的面向对象编程
2006/10/09 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
详解Vue自定义过滤器的实现
2017/01/10 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python画图的函数用法以及技巧
2019/06/28 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python之生成多层json结构的实现
2020/02/27 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
营销总经理岗位职责
2014/02/02 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
感谢信范文大全
2015/01/23 职场文书
宣传委员竞选稿
2015/11/19 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript