python3实现二叉树的遍历与递归算法解析(小结)


Posted in Python onJuly 03, 2019

1、二叉树的三种遍历方式

二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历 即:先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根

遍历总体思路:将树分成最小的子树,然后按照顺序输出

python3实现二叉树的遍历与递归算法解析(小结)

1.1 先序遍历

a 先访问根节点

b 访问左节点

c 访问右节点

a(b ( d ( h ) )( e ( i ) ))( c ( f )( g )) -- abdheicfg

1.2 中序遍历

a 先访问左节点

b 访问根节点

c 访问右节点

( ( ( h ) d ) b ( ( i ) e ) ) a ( ( f ) c ( g ) ) -- hdbieafcg

1.3后序遍历

a 先访问左节点

b 访问右节点

c 访问根节点

((hd)(ie)b)(fgc)a -- hdiebfgca

2、python3实现树结构

#实现树结构的类,树的节点有三个私有属性 左指针 右指针 自身的值
class Node():

  def __init__(self,data=None):
    self._data = data
    self._left = None
    self._right = None

  def set_data(self,data):
    self._data = data

  def get_data(self):
    return self._data

  def set_left(self,node):
    self._left = node

  def get_left(self):
    return self._left

  def set_right(self,node):
    self._right = node

  def get_right(self):
    return self._right

if __name__ == '__main__':
  #实例化根节点
  root_node = Node('a')
  # root_node.set_data('a')
  #实例化左子节点
  left_node = Node('b')
  #实例化右子节点
  right_node = Node('c')
  
  #给根节点的左指针赋值,使其指向左子节点
  root_node.set_left(left_node)
  #给根节点的右指针赋值,使其指向右子节点
  root_node.set_right(right_node)

  print(root_node.get_data(),root_node.get_left().get_data(),root_node.get_right().get_data())

3、实现树的递归遍历(前 中 后 层次遍历)

下例是树的遍历算法,其中对树的类进行了优化,

#实现树结构的类,树的节点有三个私有属性 左指针 右指针 自己的值
class Node():

  def __init__(self,data =None,left=None,right = None):
    self._data = data
    self._left = left
    self._right = right


#先序遍历 遍历过程 根左右
def pro_order(tree):
  if tree == None:
    return False
  print(tree._data)
  pro_order(tree._left)
  pro_order(tree._right)

#后序遍历
def pos_order(tree):
  if tree == None:
    return False
  # print(tree.get_data())
  pos_order(tree._left)
  pos_order(tree._right)
  print(tree._data)

#中序遍历
def mid_order(tree):
  if tree == None:
    return False
  # print(tree.get_data())
  mid_order(tree._left)
  print(tree._data)
  mid_order(tree._right)


#层次遍历
def row_order(tree):
  # print(tree._data)
  queue = []
  queue.append(tree)
  while True:
    if queue==[]:
      break
    print(queue[0]._data)
    first_tree = queue[0]
    if first_tree._left != None:
      queue.append(first_tree._left)
    if first_tree._right != None:
      queue.append(first_tree._right)
    queue.remove(first_tree)

if __name__ == '__main__':

  tree = Node('A',Node('B',Node('D'),Node('E')),Node('C',Node('F'),Node('G')))
  pro_order(tree)
  mid_order(tree)
  pos_order(tree)

4、递归算法

python3实现二叉树的遍历与递归算法解析(小结)

python3实现二叉树的遍历与递归算法解析(小结)

上面两张图片是从知乎贴过来的;图1中返回后会直接返回到上一级的返回,这种想法是不全面的,较合理的返回应该是如图2 在子函数返回时应返回到调用子函数的节点,这样在执行完剩余代码再返回到上一级

如果是按照图1返回的话二叉树的遍历就不能按照上例来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中类的继承代码实例
Oct 28 Python
在Django中创建动态视图的教程
Jul 15 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python实现通讯录功能
Feb 22 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
python机器学习实现决策树
Nov 11 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Python数据正态性检验实现过程
Apr 18 Python
python中return如何写
Jun 18 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
Django一小时写出账号密码管理系统
Apr 29 Python
python简单区块链模拟详解
Jul 03 #Python
python使用递归的方式建立二叉树
Jul 03 #Python
python挖矿算力测试程序详解
Jul 03 #Python
如何用Python做一个微信机器人自动拉群
Jul 03 #Python
Python中的正则表达式与JSON数据交换格式
Jul 03 #Python
python实现共轭梯度法
Jul 03 #Python
python实现微信自动回复及批量添加好友功能
Jul 03 #Python
You might like
php切割页面div内容的实现代码分享
2012/07/31 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
python提取页面内url列表的方法
2015/05/25 Python
Python的时间模块datetime详解
2017/04/17 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
化工专业应届生求职信
2013/11/08 职场文书
员工薪酬激励方案
2014/06/13 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2014年消防工作总结
2014/11/21 职场文书
感谢信范文大全
2015/01/23 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python