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发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
python 使用openpyxl读取excel数据
Feb 18 Python
jupyter notebook指定启动目录的方法
Mar 02 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/25 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
python中cPickle类使用方法详解
2018/08/27 Python
python绘制简单彩虹图
2018/11/19 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
远程调用的原理
2014/07/05 面试题
十一个高级MySql面试题
2014/10/06 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
《石榴》教学反思
2014/03/02 职场文书
股权转让协议书范本
2014/04/12 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
2014年前台接待工作总结
2014/12/05 职场文书