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中文分词实现方法(安装pymmseg)
Jun 14 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
python中class的定义及使用教程
Sep 18 Python
python分布式计算dispy的使用详解
Dec 22 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
python 遍历磁盘目录的三种方法
Apr 02 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
php给图片加文字水印
2015/07/31 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
python正则分析nginx的访问日志
2017/01/17 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
优秀员工推荐信
2014/05/10 职场文书
学习心理学的体会
2014/11/07 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS