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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
python 画条形图(柱状图)实例
Apr 24 Python
python 实现aes256加密
Nov 27 Python
Python中对象的比较操作==和is区别详析
Feb 12 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自动加载机制的深入分析
2013/06/08 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
javascript一些不错的函数脚本代码
2008/09/10 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Pytorch中.new()的作用详解
2020/02/18 Python
Python安装whl文件过程图解
2020/02/18 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
急诊科护士自我鉴定
2013/10/14 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
财务主管岗位职责
2014/02/28 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
《秋思》教学反思
2016/02/23 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python