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实现各种排序算法的代码示例总结
Dec 11 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
python让列表倒序输出的实例
Jun 25 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Django REST framework 视图和路由详解
Jul 19 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
python自动点赞功能的实现思路
Feb 26 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
通过实例解析python and和or使用方法
Nov 14 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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的ASP防火墙
2006/10/09 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP学习笔记之session
2018/05/06 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python 通过exifread读取照片信息
2020/12/24 Python
python中pyqtgraph知识点总结
2021/01/26 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
中专毕业生求职简历的自我评价
2013/10/21 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
2014年计生标语
2014/06/23 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
老兵退伍感言
2015/08/03 职场文书
Python Django模型详解
2021/10/05 Python
SQL CASE 表达式的具体使用
2022/03/21 SQL Server