二叉树的遍历,分为深度优先遍历,以及广度优先遍历。
在深度优先遍历中,具体分为如下三种:
- 先序遍历:先访问根节点,再遍历左子树,再遍历右子树;
- 中序遍历:先遍历左子树,再访问根节点,再遍历右子树;
- 后序遍历:先遍历左子树,再遍历右子树,再访问根节点;
针对上图二叉树,三种遍历结果为:
- 先序遍历: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 ...
随机推荐
-
MVC设计模式
随着Web应用的商业逻辑包含逐渐复杂的公式分析计算.决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来.单独形成一部分,这样三层结构产生了. 其中‘层’是逻辑上的划分. 三层体系结构是将整 ...
-
继承多态绕点 Java篇
上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...
-
ios外包公司——技术分享:IOS开发教程
iOS入门培训,适合已经有C/C++/Java/C#基础的人学习. 本大仙主讲,总共4讲(第4讲尚在制作中),这仅仅是iOS开发的入门而已.学完本教程,应该已经足够你自学并开发app了. ...
-
与数据库打交道的Adapter----SimpleCursorAdapter
http://www.cnblogs.com/wenjiang/p/3196486.html 程序员是这个世界上最神奇的职业,因为几乎所有其他职业的人都能转到该行来,只要他智力正常,有接受过正规的编程 ...
-
openssl生成pem,密钥证书的创建
使用OpenSSL生成证书 首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情: o Creation of RSA, DH and DSA Key Paramet ...
-
舒适的路线 (code[vs] 1001)
传送门 :code[vs] 1001 思路:拿到这题的首先的思路 , 就是跑一遍最短路. 可是在尝试了一会后发现不会写,于是果断弃 尝试另外的算法.. 于是就有的以下的算法.并查集 + 乱搞(有点像 ...
-
2017ecjtu-summer training #4 UESTC 1599
题目链接 http://acm.uestc.edu.cn/#/problem/show/1599 题意 n个数 每次合并最小的两个数加到sum中,直到只剩一个数为止 常规解会超时,后来想到了用 ...
-
python获取list列表随机数据
第一种方法(推荐)适用于随机取一个值, 返回一个值import randomlist1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州']a = random.c ...
-
[ 记录 ] Vue 对象数组中一项数据改变,页面不更新
问题描述:将data中数据列表渲染到页面,循环生成 el-switch,点击页面中 el-switch 后数组中某项值改变,但是页面不更新 数据格式如下 export default{ data(){ ...
-
jquery-css处理
jquery css处理,包括CSS,位置,尺寸等 一:CSS 使用 说明 例子 css(name|pro|[,val|fn]) 访问匹配元素的样式属性 $("p").css(&q ...