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 相关文章推荐
Windows下python2.7.8安装图文教程
May 26 Python
Python中取整的几种方法小结
Jan 06 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
Python对切片命名的实现方法
Oct 16 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
Python面向对象封装操作案例详解
Dec 31 Python
详解Python的三种拷贝方式
Feb 11 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
自学python用什么系统好
Jun 23 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
php获取用户浏览器版本的方法
2015/01/03 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
日期 时间js控件
2009/05/07 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
javascript简易画板开发
2020/04/12 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
Vue中使用canvas方法总结
2019/02/12 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
Python处理JSON数据并生成条形图
2016/08/05 Python
Python环境变量设置方法
2016/08/28 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
python实现逻辑回归的方法示例
2017/05/02 Python
浅析python参数的知识点
2018/12/10 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
200行python代码实现2048游戏
2019/07/17 Python
python numpy存取文件的方式
2020/04/01 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
优秀团员事迹材料1500字
2014/08/31 职场文书
教师读书活动心得体会
2016/01/14 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
python实现简易名片管理系统
2021/04/11 Python
Python入门之基础语法详解
2021/05/11 Python