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对列表排序的方法实例分析
May 16 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
基于Python的OCR实现示例
Apr 03 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
python/golang 删除链表中的元素
Sep 14 Python
Pandas DataFrame求差集的示例代码
Dec 13 Python
Python第三方库安装缓慢的解决方法
Feb 06 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设计模式 Interpreter(解释器模式)
2011/06/26 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
python通过http下载文件的方法详解
2019/07/26 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
会计与审计毕业生自荐信范文
2013/12/30 职场文书
甜美蛋糕店创业计划书
2014/01/30 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
抵押贷款承诺书
2014/05/30 职场文书
2014年部门工作总结
2014/11/12 职场文书
公司员工体检通知
2015/04/21 职场文书
开学第一天的感想
2015/08/10 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
MySQL 时间类型的选择
2021/06/05 MySQL