算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历
leetcode-explore-learn-数据结构-二叉树1
- 1.二叉树的深度优先遍历
- 1.1前序遍历:中左右
- 1.2中序遍历:左中右
- 1.3后序遍历:左右中
- 2.二叉树的广度优先遍历
本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/
所有例题的编程语言为python
二叉树节点结构:
class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None
1.二叉树的深度优先遍历
二叉树的深度优先的三种遍历方式:这个序就是根节点在什么时候遍历
1.1前序遍历:中左右
递归的框架有了,如何在res list中加入答案,在内层再定义一个函数,
class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_pre(node):if node==None:returnres.append(node.val)dfs_pre(node.left)dfs_pre(node.right)dfs_pre(root)return res
迭代的框架:当前节点的右子树放入堆栈,存起来。将当前节点的值放入res,当前节点更新为当前节点的左子树节点。
class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(node or stack):if node:res.append(node.val)if node.right:stack.append(node.right)node=node.leftelse:node=stack.pop()return res
1.2中序遍历:左中右
递归的框架和先序遍历一样。
class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_inorder(node):if node==None:returndfs_inorder(node.left)res.append(node.val)dfs_inorder(node.right)dfs_inorder(root)return res
迭代框架:需要将什么放stack中呢,根节点一路向左遍历到底部。将根节点都放进去,放进去的就是有的节点。遍历到底端之后,逐个弹出;然后去该节点的右子树,如果右子树为空,就会弹该节点的父亲节点;如果右子树不为空,就可以迭代进去处理右子树。
class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:stack.append(node)node=node.leftelse:node=stack.pop()res.append(node.val)node=node.rightreturn res
1.3后序遍历:左右中
递归的框架和先序,中序遍历一致
class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_post(node):if node==None:returndfs_post(node.left)dfs_post(node.right)res.append(node.val)dfs_post(root)return res
迭代的框架:中右左的逆序,就是左右中。在伪前序遍历(保存左节点)的结果下,逆序输出即可。
class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:res.append(node.val)if node.left:stack.append(node.left)node=node.rightelse:node=stack.pop()return res[::-1]
2.二叉树的广度优先遍历
–层次遍历,用队列来帮助实现广度优先遍历
递归框架: 需要有一个level信息用于存储该节点所处的层次。问题:在哪里新增res的层次呢–解决方案,先判断l层次是否存在,不在的话新增。
class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []res=[]def bfs(node,l):if node==None:returnif l>len(res)-1:res.append([])res[l].append(node.val)bfs(node.left,l+1)bfs(node.right,l+1)bfs(root,0)return res
迭代框架:队列,先进先出,每层先统计队列的长度,确认要弹出的元素个数。
class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []que=[root]res=[]l=0while(que):n=len(que)res.append([])for i in range(n):node=que.pop(0)res[l].append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)l+=1return res
算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历相关推荐
- 【LeetCode】专题一 二叉树层序遍历
二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...
- 数据结构——二叉树的遍历
"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...
- 数据结构 - 二叉树的遍历
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 二叉树的遍历 N:访问根结点,L:遍历根结点的左子树 ...
- 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度
代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...
- 数据结构-二叉树层次遍历
首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...
- 数据结构-二叉树的遍历
二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...
- java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)
二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...
- Java数据结构——二叉树的遍历
作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...
- python算法与数据结构-二叉树的遍历
广度优先遍历和深度优先遍历代码如下所示: # coding=utf-8class Node(object):#尽量不加3个引号的注释了容易报错def __init__(self, item):self ...
- 数据结构 二叉树的遍历
所谓遍历, 无非就是把1个容器的所有元素逐个输出, 而这个输出是线性的. 但是二叉树是1个非线性的容器, 如何把它的元素按一定顺序输出就是1个值得学习的课题了. 一般来讲, 遍历二叉树有3种方法, ...
最新文章
- 产品经理真的是「背锅侠」吗?
- 关于安卓Apk反编译 再编译回来不能正常安装的问题
- c++-内存管理-内存对齐方式
- JavaScript——以简单的方式理解闭包
- 如何在数字化转型战略中真正获得价值?浅谈数字化转型的四个层级
- mongodb自动备份脚本
- 为你的网站加上SSL,可以使用HTTPS进行访问
- Elipse 、Idea配置 Java-Code-Formatter
- windows 弹shell_Windows系统常用免费软件“红黑榜”
- vue仿微博评论回复_Vue之 3.0升级
- ClickHouse最简单的安装方法
- css设置字体的行数,超出显示...
- ORACLE RAC 视频教程
- 2020年06月16日_万金油_新浪博客
- IT毕业生给学弟学妹们的真心话——离校座谈记录
- oho,找工作有点难度
- 鲸探发布点评:7月7日发售陈孟昕系列绘画数字藏品
- k叉树的性质_相关树及性质
- 盘点国内优秀的机器人公司
- Servlet学习之Servlet概念与运行流程
热门文章
- 解决asterisk sip呼叫 488 no acceptable here
- 网络编程模型综述 之 UNIX网络I/O模型
- 设计模式C++实现(6)——适配器模式
- c语言整型数组操作,c语言的数组操作|时刻需
- python多级字典_Python多层字典取值
- @value 静态变量_Java中的变量——通过示例学习Java编程(4)
- 【转】Ubuntu Desktop下自动启动终端并运行脚本
- 【转】C# DataTable使用方法详解
- ABP入门系列(3)——领域层定义仓储并实现
- CCIE-LAB-第二篇-端口聚合LACP+RSTP