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画ROC曲线和AUC值计算
Sep 19 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
python实现支付宝转账接口
May 07 Python
详解python运行三种方式
May 13 Python
python3中类的继承以及self和super的区别详解
Jun 26 Python
Python检测端口IP字符串是否合法
Jun 05 Python
基于Python实现简单学生管理系统
Jul 24 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
JAVA/JSP学习系列之二
2006/10/09 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
PHP多进程简单实例小结
2019/11/09 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
详解python eval函数的妙用
2017/11/16 Python
python矩阵的转置和逆转实例
2018/12/12 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
毕业生自荐信格式
2014/03/07 职场文书
工作收入住址证明
2014/10/28 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书