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中条件选择和循环语句使用方法介绍
Mar 13 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
Python paramiko模块的使用示例
Apr 11 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
在django中,关于session的通用设置方法
Aug 06 Python
python实现画出e指数函数的图像
Nov 21 Python
Python reduce函数作用及实例解析
May 08 Python
python属于解释语言吗
Jun 11 Python
Python基于百度AI实现抓取表情包
Jun 27 Python
如何用Python搭建gRPC服务
Jun 30 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中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
JavaScript 拾漏补遗
2009/12/27 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
js单例模式的两种方案
2013/10/22 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
js表单验证实例讲解
2016/03/31 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
Python实现直播推流效果
2019/11/26 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
2014年中职班主任工作总结
2014/12/16 职场文书
安全教育片观后感
2015/06/17 职场文书