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通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Python多线程扫描端口代码示例
Feb 09 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
django学习之ajax post传参的2种格式实例
May 14 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
Python 从相对路径下import的方法
2018/12/04 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
纪念建党演讲稿范文
2014/01/13 职场文书
户外婚礼策划方案
2014/02/08 职场文书
优秀医生事迹材料
2014/02/12 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
外贸业务员求职信
2014/06/16 职场文书
儿园租房协议书范本
2014/12/02 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
小程序自定义轮播图圆点组件
2022/06/25 Javascript