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的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
浅谈django三种缓存模式的使用及注意点
Sep 30 Python
Python元组知识点总结
Feb 18 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
pybind11和numpy进行交互的方法
Jul 04 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python实现转换图片背景颜色代码
Apr 30 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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中Object对象的笔记分享
2011/06/28 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
js跳转页面方法总结
2014/01/29 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python单例模式实例分析
2015/01/14 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
简单介绍Python中的round()方法
2015/05/15 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
编程实现去掉XML的重复结点
2014/05/28 面试题
保护环境建议书100字
2014/05/13 职场文书
交通安全标语
2014/06/06 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android