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的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
使用python脚本实现查询火车票工具
Jul 19 Python
Python面向对象程序设计示例小结
Jan 30 Python
谈谈Python中的while循环语句
Mar 10 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
Python print不能立即打印的解决方式
Feb 19 Python
python实现批量转换图片为黑白
Jun 16 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 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
德生PL990的分析评价
2021/03/02 无线电
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
python循环监控远程端口的方法
2015/03/14 Python
对python中的高效迭代器函数详解
2018/10/18 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python实现最常见加密方式详解
2019/07/13 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
Final类有什么特点
2012/04/25 面试题
自我评价的范文
2014/02/02 职场文书
工艺员岗位职责
2014/02/11 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
市场总监岗位职责
2015/02/11 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
Python编写nmap扫描工具
2021/07/21 Python
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript