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遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
python实现图像拼接功能
Mar 23 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
python使用glob检索文件的操作
May 20 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脚本的10个技巧(1)
2006/10/09 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
orm获取关联表里的属性值
2016/04/17 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
HTML5 与 XHTML2
2008/10/17 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
庆八一活动方案
2014/01/25 职场文书
作文评语大全
2014/04/23 职场文书
委托书的写法
2014/09/16 职场文书
硕士学位论文评语
2014/12/31 职场文书
大班下学期个人总结
2015/02/13 职场文书
城南旧事电影观后感
2015/06/16 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js