【算法】【python实现】二叉树深度、广度优先遍历
二叉树的遍历,分为深度优先遍历,以及广度优先遍历。
在深度优先遍历中,具体分为如下三种:
- 先序遍历:先访问根节点,再遍历左子树,再遍历右子树;
- 中序遍历:先遍历左子树,再访问根节点,再遍历右子树;
- 后序遍历:先遍历左子树,再遍历右子树,再访问根节点;

针对上图二叉树,三种遍历结果为:
- 先序遍历: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实现】二叉树深度、广度优先遍历的更多相关文章
- 【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术
题目一 剑指 Offer 32 - I. 从上到下打印二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xi ...
- python 实现二叉树的深度 & 广度优先遍历
什么是树 在计算器科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系 ...
- leetcode--200--python(深度广度优先遍历实现代码)
点滴积累,厚积薄发,做好每一天,向时间要效率,向生命要质量. 一.深度优先搜索和广度优先搜索DFS(Depth-First-Search),是盲目搜索算法的一种.常常用在树的遍历及图的处理上.假设当前 ...
- 算法 dfs —— 将二叉树 先序遍历 转为 链表
将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...
- Python实现二叉树的前序遍历、中序遍历
计算根节点到叶子节点的所组成的数字(1247, 125, 1367)以及叶子节点到根节点组成的数字(7421, 521, 8631),其二叉树树型结构如下 计算从根节点到叶子节点组成的数字,本质上来说 ...
- Python数据结构——二叉树
数的特征和定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都 ...
- leetcode之二叉树的层序遍历
1.题目描述 2.题目分析 二叉树的层序遍历主要算法思想是使用 队列这一数据结构实现,这个数据结构多应用在和 图相关的算法.例如图的广度优先遍历就可以使用队列的方法实现.本题的关键在于如何识别出一层已 ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- python算法-二叉树广度优先遍历
广度优先遍历:优先遍历兄弟节点,再遍历子节点 算法:通过队列实现-->先进先出 广度优先遍历的结果: 50,20,60,15,30,70,12 程序遍历这个二叉树: # encoding=utf ...
随机推荐
- lr12 websocket
loadrunner12以上版本支持websocket,在http/html协议录制时可以直接录制websocket相关内容信息. 网上找的一个测试websocket网址:http://www.blu ...
- mysql 5.7 json
项目中使用的mysql5.6数据库,数据库表一张表中存的字段为blob类型的json串数据.性能压测中涉及该json串处理效率比较低,开发人员提到mysql5.7版本后json串提供了原生态的json ...
- kettle集群(转换)
1.定义子服务器 新建子服务器中有一个必须为主服务器 新建集群 在需求集群运行的步骤中右键集群进行使用
- python之路4-文件操作
对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 f = open('lyrics','r',encoding='utf-8') read_line = f.r ...
- 进程初识和multiprocessing模块之Process
一.什么是进程 进程就是运行中的程序 进程是操作系统中最小的资源分配单位 进程与进程之间的关系 : 数据隔离的 进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识, ...
- [BZOJ 4819] [SDOI 2017] 新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...
- 机器学习---线性回归(Machine Learning Linear Regression)
线性回归是机器学习中最基础的模型,掌握了线性回归模型,有利于以后更容易地理解其它复杂的模型. 线性回归看似简单,但是其中包含了线性代数,微积分,概率等诸多方面的知识.让我们先从最简单的形式开始. 一元 ...
- 用expect实现SCP/SSH自动输入密码登录
在命令行ssh远程登录服务器和scp远程传输文件都需要交互式输入密码,无法像mysql登录数据库 mysql -uroot -p123456一样直接完成. 其实可以用脚本依赖expect来达到这一目的 ...
- 如何确定Kafka的分区数、key和consumer线程数
[原创]如何确定Kafka的分区数.key和consumer线程数 在Kafak中国社区的qq群中,这个问题被提及的比例是相当高的,这也是Kafka用户最常碰到的问题之一.本文结合Kafka源码试 ...
- 「LibreOJ NOI Round #1」验题
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...