Python实现二叉树结构与进行二叉树遍历的方法详解


Posted in Python onMay 24, 2016

二叉树的建立

Python实现二叉树结构与进行二叉树遍历的方法详解

使用类的形式定义二叉树,可读性更好

class BinaryTree:
  def __init__(self, root):
    self.key = root
    self.left_child = None
    self.right_child = None
  def insert_left(self, new_node):
    if self.left_child == None:
      self.left_child = BinaryTree(new_node)
    else:
      t = BinaryTree(new_node)
      t.left_child = self.left_child
      self.left_child = t
  def insert_right(self, new_node):
    if self.right_child == None:
      self.right_child = BinaryTree(new_node)
    else:
      t = BinaryTree(new_node)
      t.right_child = self.right_child
      self.right_child = t
  def get_right_child(self):
    return self.right_child
  def get_left_child(self):
    return self.left_child
  def set_root_val(self, obj):
    self.key = obj
  def get_root_val(self):
    return self.key

r = BinaryTree('a')
print(r.get_root_val())
print(r.get_left_child())
r.insert_left('b')
print(r.get_left_child())
print(r.get_left_child().get_root_val())
r.insert_right('c')
print(r.get_right_child())
print(r.get_right_child().get_root_val())
r.get_right_child().set_root_val('hello')
print(r.get_right_child().get_root_val())

Python进行二叉树遍历

需求:
python代码实现二叉树的:
1. 前序遍历,打印出遍历结果
2. 中序遍历,打印出遍历结果
3. 后序遍历,打印出遍历结果
4. 按树的level遍历,打印出遍历结果
5. 结点的下一层如果没有子节点,以‘N'代替

方法:
使用defaultdict或者namedtuple表示二叉树
使用StringIO方法,遍历时写入结果,最后打印出结果
打印结点值时,如果为空,StringIO()写入‘N '
采用递归访问子节点
代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# test tree as below:
''' 1 / \ / \ / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 N / \ / \ / \ 7 N N N 8 9 / \ / \ / \ N N N N N N '''

from collections import namedtuple
from io import StringIO

#define the node structure
Node = namedtuple('Node', ['data', 'left', 'right'])
#initialize the tree
tree = Node(1,
      Node(2,
         Node(4,
           Node(7, None, None),
           None),
         Node(5, None, None)),
      Node(3,
         Node(6,
           Node(8, None, None),
           Node(9, None, None)),
         None))
#read and write str in memory
output = StringIO()


#read the node and write the node's value
#if node is None, substitute with 'N '
def visitor(node):
  if node is not None:
    output.write('%i ' % node.data)
  else:
    output.write('N ')


#traversal the tree with different order
def traversal(node, order):
  if node is None:
    visitor(node)
  else:
    op = {
        'N': lambda: visitor(node),
        'L': lambda: traversal(node.left, order),
        'R': lambda: traversal(node.right, order),
    }
    for x in order:
      op[x]()


#traversal the tree level by level
def traversal_level_by_level(node):
  if node is not None:
    current_level = [node]
    while current_level:
      next_level = list()
      for n in current_level:
        if type(n) is str:
          output.write('N ')
        else:
          output.write('%i ' % n.data)
          if n.left is not None:
            next_level.append(n.left)
          else:
            next_level.append('N')
          if n.right is not None:
            next_level.append(n.right)
          else:
            next_level.append('N ')

      output.write('\n')
      current_level = next_level


if __name__ == '__main__':
  for order in ['NLR', 'LNR', 'LRN']:
    if order == 'NLR':
      output.write('this is preorder traversal:')
      traversal(tree, order)
      output.write('\n')
    elif order == 'LNR':
      output.write('this is inorder traversal:')
      traversal(tree, order)
      output.write('\n')
    else:
      output.write('this is postorder traversal:')
      traversal(tree, order)
      output.write('\n')

  output.write('traversal level by level as below:'+'\n')
  traversal_level_by_level(tree)

  print(output.getvalue())
Python 相关文章推荐
Python实现备份文件实例
Sep 16 Python
Python获取文件ssdeep值的方法
Oct 05 Python
解析Python中的异常处理
Apr 28 Python
详解Django框架中用context来解析模板的方法
Jul 20 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
python 爬虫出现403禁止访问错误详解
Mar 11 Python
Python的标准模块包json详解
Mar 13 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
python如何对实例属性进行类型检查
Mar 20 Python
Python工厂函数用法实例分析
May 14 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
Python中set与frozenset方法和区别详解
May 23 #Python
python实现多线程的两种方式
May 22 #Python
python实现简单购物商城
May 21 #Python
python字符串的常用操作方法小结
May 21 #Python
python实现用户登录系统
May 21 #Python
python列表的常用操作方法小结
May 21 #Python
bat和python批量重命名文件的实现代码
May 19 #Python
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
js版本A*寻路算法
2006/12/22 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python打开文件并获取文件相关属性的方法
2015/04/23 Python
PyMongo安装使用笔记
2015/04/27 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python实现简单的语音识别系统
2017/12/13 Python
Python操作Excel的学习笔记
2021/02/18 Python
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
化妆品活动策划方案
2014/05/23 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
Docker下安装Oracle19c
2022/04/13 Servers