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 开发Activex组件方法
Nov 08 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
Python中os.path用法分析
Jan 15 Python
Python命令行参数解析模块getopt使用实例
Apr 13 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 Python
如何用python插入独创性声明
Mar 31 Python
使用tensorflow 实现反向传播求导
May 26 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函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
Display SQL Server Login Mode
2007/06/21 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python算法学习之计数排序实例
2013/12/18 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
python机器学习实战之树回归详解
2017/12/20 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
经典的班主任推荐信
2013/10/28 职场文书
最新自我评价范文
2013/11/16 职场文书
文明风采获奖感言
2014/02/18 职场文书
结婚周年感言
2014/02/24 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis