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设计模式之观察者模式实例
Apr 26 Python
列举Python中吸引人的一些特性
Apr 09 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
Python之matplotlib绘制饼图
Apr 13 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将向Java靠拢
2006/10/09 PHP
PHP中的事务使用实例
2015/05/26 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
JavaScript 数组详解
2013/10/10 Javascript
Node.js编码规范
2014/07/14 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
python解析json实例方法
2013/11/19 Python
python解析html开发库pyquery使用方法
2014/02/07 Python
Python实现单词拼写检查
2015/04/25 Python
pandas实现选取特定索引的行
2018/04/20 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python中metaclass原理与用法详解
2019/06/25 Python
简单了解python PEP的一些知识
2019/07/13 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
个人职业及收入证明
2014/10/13 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
2014年稽查工作总结
2014/12/20 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL