树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。

一、广度优先遍历(层次遍历)

从树的root开始,从上到下从从左到右遍历整个树的节点

二、深度优先遍历

对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。

1、先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
根节点->左子树->右子树

2、中序遍历 在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
左子树->根节点->右子树

3、后序遍历 在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点

'''
树形结构
'''class Node(object):'''节点类'''def __init__(self, elem, lChild = None, rChild = None):self.elem = elemself.lChild = lChild #左子树self.rChild = rChild #又子树class Tree(object):'''二叉树'''def __init__(self, node = None):self.root = nodedef add(self, item):'''添加子树''''''思路1、先找到要添加元素的节点'''node = Node(item)if self.root is None:self.root = nodereturnli = [self.root]while li:cur_node = li.pop(0)if cur_node.lChild is not None:li.append(cur_node.lChild)else:cur_node.lChild = nodereturnif cur_node.rChild is not None:li.append(cur_node.rChild)else:cur_node.rChild = nodereturndef breadth_travel(self):'''广度优先遍历'''if self.root is None:returnli = [self.root]while li:cur_node = li.pop(0)print(cur_node.elem, end=' ')if cur_node.lChild is not None:li.append(cur_node.lChild)if cur_node.rChild is not None:li.append(cur_node.rChild)print(' ')def preorder(self, node):'''先序遍历'''if node is None:returnprint(node.elem, end=' ')self.preorder(node.lChild)self.preorder(node.rChild)def inorder(self, node):'''中序优先遍历'''if node is None:returnself.preorder(node.lChild)print(node.elem, end=' ')self.preorder(node.rChild)def postorder(self, node):'''后续优先遍历'''if node is None:returnself.preorder(node.lChild)self.preorder(node.rChild)print(node.elem, end=' ')if __name__ == "__main__":tree = Tree()tree.add(0)tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.add(6)tree.add(7)tree.add(8)tree.add(9)tree.breadth_travel()print(" - ")tree.preorder(tree.root)print(" ")tree.inorder(tree.root)print(" ")tree.postorder(tree.root)print(" ")

Python二叉树遍历相关推荐

  1. python二叉树遍历算法_分享python实现的二叉树定义与遍历

    这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...

  2. python二叉树遍历例子_python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作: 1).访问结点本身(N) 2).遍历该结点的左子树( ...

  3. python 二叉树遍历

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon May 13 15:48:30 201 ...

  4. python 二叉树遍历递归非递归_python实现二叉树递归遍历与非递归遍历

    一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...

  5. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  6. python 递归遍历二叉树

    python 递归遍历二叉树 我确定很多人不能真正的理解二叉树-- class Node: def __init__(self,value=0,left=0,right=0): self.value= ...

  7. Python二叉树的三种深度优先遍历

    Python二叉树的三种深度优先遍历 一.广度优先遍历和深度优先遍历 对二叉树进行遍历(traversal)是指依次对树中每个节点进行访问,在遍历的过程中实现需要的业务. 对树的遍历方式有广度优先遍历 ...

  8. Python:二叉树遍历

    二叉树遍历共有四种方法,分别是前序遍历.中序遍历.后序遍历和层次遍历. 前序遍历: 父节点--左孩子--右孩子 中序遍历:左孩子--父节点--右孩子 后序遍历:左孩子--右孩子--父节点 层次遍历:利 ...

  9. python 二叉树的序列化和反序列化

    python 二叉树的序列化和反序列化 一.leetcode 297 二.为什么要反序列化? 三.反序列化设计 四.序列化设计 五.leetcode 297题 一.leetcode 297 序列化是将 ...

最新文章

  1. 有关增强现实技术的过去、现在和未来的发展
  2. javascript自定义startWith()和endWith()方法
  3. Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式
  4. mysql odbc.ini_关于unixodbc中odbc.ini和odbcinst.ini的介绍
  5. nodejs mac启动相关命令
  6. java基础知识点(6)——循环语句for-while
  7. 自动备份 SourceSafe
  8. python 读取文件到字典读取顺序_Python用list或dict字段模式读取文件的方法
  9. 中级软件设计师笔记全套 看完你就过啦
  10. html 转盘抽奖开发,html 大转盘抽奖
  11. SpringBoot项目实现网络测速功能
  12. 你知识付费的钱打水漂,是课程的错吗?
  13. cesium粒子特效
  14. layim之初始化配置
  15. PPT文件无法打开处理
  16. html p标签行间距怎么调,css怎么设置行距?
  17. java warmup,20. dubbo源码-预热warmup过程
  18. Omnipeek空口抓包(2):扫描无线网络
  19. 定义一个教师类输出他的基本信息,类和静态的练习--C#
  20. Howler.js音频播放终极解决方案

热门文章

  1. python的kite下载安装及使用_Kite下载|Kite Python编程工具 V1.2020.1203.0 最新版下载 - 下载银行...
  2. jfinal mysql 配置文件_JFinal 如何将操作日志存入到数据库中
  3. mysql中主从复制配置文件_MySQL主从复制 配置文件实例
  4. python非法语句是_python 如何优雅的处理大量异常语句?
  5. html5滑动删除置顶,html5向左滑动删除特效
  6. if是什么c语言,这个C语言是什么(if(1))?
  7. airplay2协议是什么_什么是AirPlay?
  8. java计算时间差距_硬计算和软计算之间的差异
  9. Spring IoC?看这篇文章就够了...
  10. Java核心(一)线程Thread详解