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 import用法以及与from...import的区别
May 28 Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
Python每天必学之bytes字节
Jan 28 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python中eval与int的区别浅析
Aug 11 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Django中的session用法详解
Mar 09 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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
linux下编译安装memcached服务
2014/08/03 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
javascript document.execCommand() 常用解析
2009/12/14 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
python2.7的编码问题与解决方法
2016/10/04 Python
python对json的相关操作实例详解
2017/01/04 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Python实现自动装机功能案例分析
2020/10/22 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
JSF界面控制层技术
2013/06/17 面试题
电气自动化大学生求职信
2013/10/16 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
三八妇女节主持词
2015/07/04 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL