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中文编码那些事
Jun 25 Python
Python函数中定义参数的四种方式
Nov 30 Python
python基础之入门必看操作
Jul 26 Python
在mac下查找python包存放路径site-packages的实现方法
Nov 06 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
python感知机实现代码
Jan 18 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
python删除文件、清空目录的实现方法
Sep 23 Python
python matplotlib绘制三维图的示例
Sep 24 Python
Python上下文管理器Content Manager
Jun 26 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 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
javascript 写类方式之八
2009/07/05 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python 多线程应用介绍
2012/12/19 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
django settings.py 配置文件及介绍
2019/07/15 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
pandas参数设置的实用小技巧
2020/08/23 Python
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
师范大学音乐表演专业求职信
2013/10/23 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
秋季运动会开幕词
2015/01/28 职场文书
同学聚会通知书
2015/04/20 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
Java无向树分析 实现最小高度树
2022/04/09 Javascript