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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python中asyncio模块的深入讲解
Jun 10 Python
python画双y轴图像的示例代码
Jul 07 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
python psutil监控进程实例
Dec 17 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
简单的命令查看安装的python版本号
Aug 28 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
Python命令行参数定义及需要注意的地方
Nov 30 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
你常见到的runtime exception
2016/09/05 面试题
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
2014年财政所工作总结
2014/11/22 职场文书
检讨书范文1000字
2015/01/28 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
员工开除通知书
2015/04/25 职场文书
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
mysql的Buffer Pool存储及原理
2022/04/02 MySQL