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中文字符串截取问题
Jun 15 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
Django创建一个后台的基本步骤记录
Oct 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购物车实现代码
2011/10/10 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
React简单介绍
2017/05/24 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Python 的 Socket 编程
2015/03/24 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
英语生日邀请函
2014/01/23 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
分家协议书范本
2016/03/22 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js