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 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
python3实现点餐系统
Jan 24 Python
python安装numpy和pandas的方法步骤
May 27 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
python如何爬取网页中的文字
Jul 28 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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 批量生成html,txt文件的实现代码
2013/06/26 PHP
PHPMailer发送邮件
2016/12/28 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
python实现IOU计算案例
2020/04/12 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
应届生船舶驾驶求职信
2013/10/19 职场文书
军神教学反思
2014/02/04 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
小学生期末评语
2014/04/21 职场文书
工作保证书范文
2014/04/29 职场文书
委托书如何写
2014/08/30 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
政府会议通知范文
2015/04/15 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫