二叉树的遍历,分为深度优先遍历,以及广度优先遍历。

在深度优先遍历中,具体分为如下三种:

  • 先序遍历:先访问根节点,再遍历左子树,再遍历右子树;
  • 中序遍历:先遍历左子树,再访问根节点,再遍历右子树;
  • 后序遍历:先遍历左子树,再遍历右子树,再访问根节点;

针对上图二叉树,三种遍历结果为:

  • 先序遍历:50,20,15,30,60,70
  • 中序遍历:15,20,30,50,60,70
  • 后序遍历:15,30,20,70,60,50

实现代码如下:

# 定义二叉树节点
class TreeNode(object):
def __init__(self,val,left=None,right=None):
self.val=val
self.left=left
self.right=right #定义二叉树类
class BinaryTree(object):
def __init__(self,root=None):
self.root=root def preOrder(self,retList=[],node='root'):
if node!=None:
retList.append(node)
self.preOrder(retList,node.left)    # 递归调用,将左子节点放到列表里  
self.preOrder(retList,node.right)   # 递归调用,将右节点放到列表里  
return retList def inOrder(self,retList=[],node='root'):
if node!=None:
self.inOrder(retList,node.left)
retList.append(node)
self.inOrder(retList,node.right)
return retList
def postOrder(self,retList=[],node='root'):
if node!=None:
self.postOrder(retList,node.left)
self.postOrder(retList,node.right)
retList.append(node)
return retList if __name__=='__main__':
rootNode=TreeNode(50)
rootNode.left = TreeNode(20,left=TreeNode(15),right=TreeNode(30))
rootNode.right = TreeNode(60,right=TreeNode(70))
binaryTree=BinaryTree(rootNode)
ret = binaryTree.preOrder([],binaryTree.root)
for i in ret:
print(i.val,end='.')
print('\n'+'-'*20)
ret = binaryTree.inOrder([],binaryTree.root)
for i in ret:
print(i.val,end='.')
print('\n'+'-'*20)
ret = binaryTree.postOrder([],binaryTree.root)
for i in ret:
print(i.val,end='.')

  

广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。

上图二叉树遍历结果为:50,20,60,15,30,70

实现代码如下:

from queue import Queue

class TreeNode(object):
def __init__(self,var,left=None,right=None):
self.var = var
self.left = left
self.right = right class BinaryTree(object):
def __init__(self,root = None):
self.root = root def breathSearth(self):
if self.root == None:
return None
retList = []
queue = Queue()
queue.put(self.root)
while queue.empty() is not True:
node = queue.get()
retList.append(node.var)
if node.left != None:
queue.put(node.left)
if node.right != None:
queue.put(node.right)
return retList

  

【算法】【python实现】二叉树深度、广度优先遍历的更多相关文章

  1. 【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术

    题目一 剑指 Offer 32 - I. 从上到下打印二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xi ...

  2. python 实现二叉树的深度 & 广度优先遍历

    什么是树 在计算器科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系 ...

  3. leetcode--200--python(深度广度优先遍历实现代码)

    点滴积累,厚积薄发,做好每一天,向时间要效率,向生命要质量. 一.深度优先搜索和广度优先搜索DFS(Depth-First-Search),是盲目搜索算法的一种.常常用在树的遍历及图的处理上.假设当前 ...

  4. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

  5. Python实现二叉树的前序遍历、中序遍历

    计算根节点到叶子节点的所组成的数字(1247, 125, 1367)以及叶子节点到根节点组成的数字(7421, 521, 8631),其二叉树树型结构如下 计算从根节点到叶子节点组成的数字,本质上来说 ...

  6. Python数据结构——二叉树

    数的特征和定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都 ...

  7. leetcode之二叉树的层序遍历

    1.题目描述 2.题目分析 二叉树的层序遍历主要算法思想是使用 队列这一数据结构实现,这个数据结构多应用在和 图相关的算法.例如图的广度优先遍历就可以使用队列的方法实现.本题的关键在于如何识别出一层已 ...

  8. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  9. python算法-二叉树广度优先遍历

    广度优先遍历:优先遍历兄弟节点,再遍历子节点 算法:通过队列实现-->先进先出 广度优先遍历的结果: 50,20,60,15,30,70,12 程序遍历这个二叉树: # encoding=utf ...

随机推荐

  1. 拖放排序插件Sortable.js

    特点 支持触屏设备和大部分浏览器(IE9以下的就不支持了,原因都懂得) 可以从一个列表容器中拖拽一个列表单元到其他容器或本列表容器中进行排序 移动列表单元时有css动画 支持拖放操作和可选择的文本(这 ...

  2. PHP artisan migrate 报错显示 could not find driver ,怎么办?

    记录下自己的错误 一. 1.原因是没有pdo扩展导致的, 2.解决办法:打开php.ini,然后去掉以下两行代码之前的分号(:)即可.如下: extension=php_pdo_firebird.dl ...

  3. Android艺术——探究Handler运行机制

    我们从开发的角度来说,Handler是Android 的消息机制的上层接口.说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI.没错,Handler的确是用于更新UI的,具 ...

  4. Python——Django-manage.py的内容

    在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指定的IP和端口启动 python3 manage. ...

  5. Python开发第一篇

    Python 是什么? 首先他可能是比较好的一个编程开发语言!

  6. iView组件添加API中介绍的事件的方式(render方式添加事件)

    iView组件好用,文档齐全,品质可靠稳定.最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件.给作者点个赞.用这个组件来学习Vue.js也是不错的选择. 最近用的比 ...

  7. Cookie笔记

    1.Cookie HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在浏览器的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器 ...

  8. opencv 增强现实(二):特征点匹配

    import cv2 as cv import numpy as np # def draw_keypoints(img, keypoints): # for kp in keypoints: # x ...

  9. properties文件操作

    properties文件操作类 可以使用java.util.Properties读取.properties文件中的内容 import java.io.InputStream; import java. ...

  10. win32: 文本编辑框(Edit)控件响应事件

    过去几年,关于文本编辑框(Edit)控件的响应事件,我都是在主程序 while(GetMessage(&messages, NULL, 0, 0)) { ... } 捕获. 总感觉这种方式让人 ...