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使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Python二分法搜索算法实例分析
May 11 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
Python小进度条显示代码
Mar 05 Python
anaconda如何查看并管理python环境
Jul 05 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
python 6种方法实现单例模式
Dec 15 Python
python 进阶学习之python装饰器小结
Sep 04 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
解决GD中文乱码问题
2007/02/14 PHP
php创建多级目录代码
2008/06/05 PHP
PHP多例模式介绍
2013/06/24 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jQuery中的常用事件总结
2009/12/27 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
快速入门Vue
2016/12/19 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python散点图实例之随机漫步
2018/08/27 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Django REST 异常处理详解
2020/07/15 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
大一新生军训时的自我评价分享
2013/12/05 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
司机岗位职责范本
2015/04/10 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python